为了账号安全,请及时绑定邮箱和手机立即绑定

Python super() 传入 *args

Python super() 传入 *args

胡子哥哥 2023-08-15 16:29:46
我对python 继承中*args传入的约定感到困惑。super().__init__()我理解需要使用关键字参数**kwargs,以便必要时 CRO 中的类可以获取所需的参数,但为什么还有一个*args?示例:假设 Sneaky 用作多重继承类结构的一部分,例如:class Sneaky:   def __init__(self, sneaky = false, *args, **kwargs):        super().__init__(*args, **kwargs)        self.sneaky = sneakyclass Person:    def __init__(self, human = false,  *args, **kwargs):        super().__init__(*args, **kwargs)        self.human = humanclass 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 = sneakyclass Person:    def __init__(self, human = false, **kwargs):        super().__init__(**kwargs)        self.human = humanclass Thief(Sneaky, Person):     def __init__(self,  **kwargs):        super().__init__( **kwargs)t = Thief(human = true, sneaky = true)print(t.human)# True
查看完整描述

2 回答

?
翻阅古今

TA贡献1780条经验 获得超5个赞

传入*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)]

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


如果您确实想删除*args并且不支持位置参数,您也可以通过添加after来将它们从Sneakyand中排除。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

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


查看完整回答
反对 回复 2023-08-15
?
拉风的咖菲猫

TA贡献1995条经验 获得超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


查看完整回答
反对 回复 2023-08-15
  • 2 回答
  • 0 关注
  • 127 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信