python supper菱形继承

  • 对于单继承直接调用__init__与super无异,主要是针对菱形继承

对于直接使用init调基类

class A:
    def __init__(self):
        print('A')

class B(A):
    def __init__(self):
        A.__init__(self)
        print('B')

class C(A):
    def __init__(self):
        A.__init__(self)
        print('C')

class D(B, C):
    def __init__(self):
        B.__init__(self)
        C.__init__(self)
        print('D')
if __name__ == '__main__':
    o = D()
  • 输出
A
B
A
C
D

结论
劣势:

  1. 需要手动去编写父类的继承关系
  2. 针对菱形继承出现了底层公共类被重复构造的问题

使用super去构造基类

class A:
    def __init__(self):
        print('A')

class B(A):
    def __init__(self):
        super(B, self).__init__()
        print('B')

class C(A):
    def __init__(self):
        super(C, self).__init__()
        print('C')

class D(B, C):
    def __init__(self):
        super(D, self).__init__()
        print('D')

if __name__ == '__main__':
    o = D()
  • 输出:
A
C
B
D
···
> 结论
> 优势:
> 1. 只需要传入类type,则根据继承关系自动调用基类函数
> 2. 避免了重复构造底层公共类
  • mro
print(D.__mro__)
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)

super继承关系接近mro

你可能感兴趣的:(python,python,开发语言)