今天学习多继承,遇到了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程序结束