今天学习多继承,遇到了super继承顺序的问题
A是父类,BC继承A,D多继承BC
class A:
def __init__(self):
print("A")
class B(A):
def __init__(self):
print('B')
super().__init__()
class C(A):
def __init__(self):
print('C')
super().__init__()
class D(B, C):
def __init__(self):
super().__init__()
d= D()
则会得到结果
B
C
A
D.__mro__
为(__main__.D, __main__.B, __main__.C, __main__.A, object)
如果稍作修改,注释掉B类中的super
class A:
def __init__(self):
print("A")
class B(A):
def __init__(self):
print('B')
# super().__init__()
class C(A):
def __init__(self):
print('C')
super().__init__()
class D(B, C):
def __init__(self):
super().__init__()
d= D()
则会得到结果
B
说明没有执行C的init
python3中的多继承顺序依赖于方法解析顺序(MRO)
执行到B的init后,如果需要执行A的init话,才需要执行C的init。如果不执行A的init话,C的init也无需执行。
另一种情况,如果注释掉C的super
class A:
def __init__(self):
print("A")
class B(A):
def __init__(self):
print('B')
super().__init__()
class C(A):
def __init__(self):
print('C')
# super().__init__()
class D(B, C):
def __init__(self):
super().__init__()
d= D()
得到结果
B
C
根据MRO,先是B的init,B的init调用A的init,但是想要调用A的init需要根据顺序先调用C的init,C的init中没有super,执行完C的init程序结束