我遇到了必须初始化所有基类的情况
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未被初始化?
答案 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}}。