带super()的多重继承Python

带super()的多重继承Python,python,multiple-inheritance,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):

在这种情况下,我必须初始化所有基类

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没有初始化?

当两个子类提供该方法时(这里是
\uuuu init\uuuu
),Python只调用一次该方法,并根据方法解析顺序(MRO)决定调用哪个方法

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

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

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

因为
super()
不会自动调用所有继承的方法,只调用层次结构中的下一个方法。为了确保调用所有函数,在
B
C
\uuuuu init\uuuu
方法中还应该有
super()(在您的特定场景中,您只需要将它添加到
B

您希望
super
调用这两个构造函数吗?因为
B
在方法解析顺序中位于
C
之前,但不包含对
super
的调用,这比它看起来要复杂一些Python开发人员了解它的用法。