gpt4 book ai didi

python - kwargs 的多重继承

转载 作者:行者123 更新时间:2023-12-03 14:15:46 26 4
gpt4 key购买 nike

问题

我在 Dusty Phillips 的 Object Oriented Programming(为简洁起见而简化)中遇到了这段代码,但我不确定这个定义的特定部分。

class A:
def __init__(self, a, **kwargs):
super().__init__(**kwargs)
self.a = a

class B:
def __init__(self, b, **kwargs):
super().__init__(**kwargs)
self.b = b

class C(A, B):
def __init__(self, c, **kwargs):
super().__init__(**kwargs)
self.c = c

问题
  • 由于方法解析顺序是 (__main__.C, __main__.A, __main__.B, object) , 可以 class B改为以下方式定义?
  • class B:
    def __init__(self, b):
    self.b = b
  • 不是super().__init__(**kwargs)class B多余,因为有多余 kwargs传递给 C将传递给 object , 提高?

  • TypeError: object.__init__() takes exactly one argument (the instance to initialize)


  • 这是 if C 的保护措施吗?被定义为 class C(B, A)而不是 class C(A, B) ?
  • 最佳答案

    考虑如何实例化 C :

    c = C(a=3, b=5, c=9)
    C.__init__获取所有关键字参数,但仅将其用于自己的参数 c .余下的传给下一个 __init__链中的方法。在这种情况下,就是 A.__init__ ,它“提取”了 a 的参数并通过 b转至 B.__init__ . B使用它并将(现在为空的)关键字参数集传递给下一个方法, object.__init__ .因为所有关键字参数都已被其他类“声明”和处理, object.__init__成功。

    由于 MRO 的构造方式,正确使用 super() 的类集体保证 **kwargs到时候会清空 object.__init__叫做。

    关于python - kwargs 的多重继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60495296/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com