如何解决Python super传递* args
我对在Python继承中的*args
中传递super().__init__()
的约定感到困惑。
我知道需要使用关键字参数**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,**kwargs)
self.human = human
class Thief(Sneaky,Person):
def __init__(self,**kwargs)
t = Thief(human = true,sneaky = true)
print(t.human)
# True
那如果我们下面有* args呢?
class Sneaky:
def __init__(self,**kwargs):
super().__init__( **kwargs)
self.sneaky = sneaky
class Person:
def __init__(self,**kwargs):
super().__init__(**kwargs)
self.human = human
class Thief(Sneaky,**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,)
thieves = [Thief(*args) for args in zip(sneaky,human)]
这有点做作,但是我认为这说明了为什么您可能希望允许位置参数。
如果您确实要删除*args
并且不支持位置参数,则可以通过在{{1之后添加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
中。如果您尝试提供位置定位,则会产生*
。
在第一种情况下,以下代码将输出True
。
t = Thief(True,True)
print(t.human)
# True
但是在第二秒(没有*args
)中-它将引发异常:
t = Thief(True,True) # arguments without keywords
print(t.human)
# raises
# TypeError: __init__() takes 1 positional argument but 3 were given
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。