带有super()的多重继承Python



我有一种情况,我必须初始化所有基类

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()不会自动调用所有继承的方法,只会调用层次结构中的下一个方法。为了确保所有调用都被调用,您应该在BC__init__方法中也有super().__init__()(在您的特定场景中,您只需要将其添加到B

相关内容

  • 没有找到相关文章

最新更新