Python多继承 super 执行父类init

今天学习多继承,遇到了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()

则会得到结果

说明没有执行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程序结束

Original: https://www.cnblogs.com/antelx/p/15871578.html
Author: Antel
Title: Python多继承 super 执行父类init

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/643588/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球