我感到困惑传递的惯例*args
在super().__init__()
Python中继承。我知道需要使用关键字参数,**kwargs
以便必要时CRO中的类可以使用所需的参数,但是为什么还有一个*args
?
示例:假设Sneaky被用作多重继承类结构的一部分,例如:
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
传递*args
意味着您可以初始化自己的Thief
喜欢
>> x = Thief(True, False)
>> x.human
False
>> x.sneaky
True
这很容易阅读,并且很难通过多重继承进行跟踪,但这可能很有用。保持此功能意味着您可以做
sneaky = (True, False, True,)
human = (True, False, False,)
thieves = [Thief(*args) for args in zip(sneaky, human)]
这有点做作,但是我认为这说明了为什么您可能希望允许位置参数。
如果你想删除的*args
和不支持位置参数,你可以排除他们Sneaky
和Person
加入,以及*,
之后self,
。
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
这不会将所有位置参数都放在un-named中*
。TypeError
如果您尝试提供位置定位,这将引发一个问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句