Python super()传入*args

2024-10-06 11:56:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我对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

Tags: selffalsetrue参数initdefargskwargs
2条回答

在第一种情况下,下面的代码将输出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

传入*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而不支持位置参数,则也可以通过在self,之后添加*,将其从SneakyPerson中排除

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

这不会将所有位置参数放在未命名的*中。如果您试图提供位置分段,这将引发TypeError

相关问题 更多 >