具有super()的多重继承Python

时间:2018-12-03 14:48:58

标签: python multiple-inheritance

我遇到了必须初始化所有基类的情况

class B:
    def __init__(self):
        print("B.__init__")

class C:
    def __init__(self):
        print("C.__init__")

class D(B,C):
    def __init__(self):
        print("D.__init__")
        super().__init__()

class E(D):
    def __init__(self):
        print("E.__init__")
        super().__init__()

x = E()

但是上面的代码导致

E.__init__
D.__init__
B.__init__

我担心的是为什么C未被初始化?

2 个答案:

答案 0 :(得分:2)

当两个子类提供方法时(此处为__init__),Python仅调用该方法一次,并根据方法解析顺序(MRO)决定调用哪个方法。

您可以通过访问__mro__属性来检查MRO。

>>> D.__mro__
(__main__.D, __main__.B, __main__.C, object)

调用方法时,首先要查看的地方是D,然后是B,然后是C,然后是object

答案 1 :(得分:1)

因为super()不会自动调用继承的方法的 all ,因此只会自动调用层次结构中的下一个方法。为了确保所有人都被调用,您还应该在super().__init__()__init__的{​​{1}}方法中使用B(在您的特定情况下,您只需将其添加到{ {1}}。