博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Python多继承 super 执行父类init

Posted on 2022-02-08 15:55  Antel  阅读(421)  评论(0编辑  收藏  举报

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