Python super()传递* args

杨fi |

我感到困惑传递的惯例*argssuper().__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和不支持位置参数,你可以排除他们SneakyPerson加入,以及*,之后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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章