我对python继承中在super().__init__()
中传递*args
的约定感到困惑。
我理解需要使用关键字参数**kwargs
,因此如果需要,CRO中的类可以使用所需的参数,但是为什么还有*args
例如: 假设Skilly用作多重继承类结构的一部分,例如:
class Sneaky:
def __init__(self, sneaky = false, *args, **kwargs):
super().__init__(*args, **kwargs)
self.sneaky = sneaky
class Person:
def __init__(self, human = false, *args, **kwargs):
super().__init__(*args, **kwargs)
self.human = human
class Thief(Sneaky, Person):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
t = Thief(human = true, sneaky = true)
print(t.human)
# True
那么,如果我们在下面删除*args呢
class Sneaky:
def __init__(self, sneaky = false, **kwargs):
super().__init__( **kwargs)
self.sneaky = sneaky
class Person:
def __init__(self, human = false, **kwargs):
super().__init__(**kwargs)
self.human = human
class Thief(Sneaky, Person):
def __init__(self, **kwargs):
super().__init__( **kwargs)
t = Thief(human = true, sneaky = true)
print(t.human)
# True
在第一种情况下,下面的代码将输出
True
但在第二种情况下(没有
*args
),它将引发异常:传入
*args
意味着您可以初始化Thief
类这很难理解,也很难用多重继承进行跟踪,但它可能很有用。维护此功能意味着您可以
这有点做作,但我认为它说明了为什么您可能希望允许位置参数
如果确实要删除
*args
而不支持位置参数,则也可以通过在self,
之后添加*,
将其从Sneaky
和Person
中排除这不会将所有位置参数放在未命名的
*
中。如果您试图提供位置分段,这将引发TypeError
相关问题 更多 >
编程相关推荐