带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开发人员了解它的用法。