首页 > 解决方案 > 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,  *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

标签: pythonsuper

解决方案


传入*args意味着你可以初始化你的Thieflike

>> 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)]

这有点做作,但我认为它说明了为什么您可能希望允许位置参数。

如果您确实想删除并且不支持位置参数,您可以通过添加after*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

这不会将所有位置参数放在未命名的*. TypeError如果您尝试提供位置论据,这将引发 a 。


推荐阅读