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


胡子哥哥
浏览 128回答 2
2回答

翻阅古今

传入*args意味着可以初始化你的Thieflike>> x = Thief(True, False)>> x.humanFalse>> x.sneakyTrue这读起来很混乱,并且很难通过多重继承来跟踪,但它可能很有用。保持这种能力意味着你可以做sneaky = (True, False, True,)human = (True, False, False,)thieves = [Thief(*args) for args in zip(sneaky, human)]这有点做作,但我认为它说明了为什么您可能希望允许位置参数。如果您确实想删除*args并且不支持位置参数,您也可以通过添加after来将它们从Sneakyand中排除。Person*,self,class Sneaky:    def __init__(self, *, sneaky=False, **kwargs):        super().__init__(**kwargs)        self.sneaky = sneakyclass Person:    def __init__(self, *, human=False, **kwargs):        super().__init__(**kwargs)        self.human = human这不会将所有位置参数放入未命名的*. TypeError如果您尝试提供位置论证,这将引发 a 。

拉风的咖菲猫

在第一种情况下,以下代码将输出True。t = Thief(True, True)print(t.human)# True但在第二个(没有*args) - 它会引发异常:t = Thief(True, True)  # arguments without keywordsprint(t.human)# raises# TypeError: __init__() takes 1 positional argument but 3 were given
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python