我有一种情况,我必须初始化所有基类
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没有初始化?
当两个子类提供该方法(此处为__init__
(时,Python只调用该方法一次,并根据方法解析顺序(MRO(决定调用哪一个。
您可以通过访问__mro__
属性来检查MRO。
>>> D.__mro__
(__main__.D, __main__.B, __main__.C, object)
当调用一个方法时,首先要查找的位置是D
,然后是B
,再是C
,然后是object
。
因为super()
不会自动调用所有继承的方法,只会调用层次结构中的下一个方法。为了确保所有调用都被调用,您应该在B
和C
的__init__
方法中也有super().__init__()
(在您的特定场景中,您只需要将其添加到B
。