美文网首页Python
python:super()对多继承的影响

python:super()对多继承的影响

作者: alan2yang | 来源:发表于2019-01-15 13:26 被阅读9次

先对比如下两段代码的区别:

1. 使用 父类.父类方法(self)的方式继承

class A:
    def __init__(self):
        print("Enter A")
        print("Leave A")

class B(A):
    def __init__(self):
        print("Enter B")
        A.__init__(self)
        print("Leave B")

class C(A):
    def __init__(self):
        print("Enter C")
        A.__init__(self)
        print("Leave C")

class D(A):
    def __init__(self):
        print("Enter D")
        A.__init__(self)
        print("Leave D")

class E(B, C, D):
    def __init__(self):
        print("Enter E")
        B.__init__(self)
        C.__init__(self)
        D.__init__(self)
        print("Leave E")

E()
print(E.__mro__)

# 结果如下:
Enter E
Enter B
Enter A
Leave A
Leave B
Enter C
Enter A
Leave A
Leave C
Enter D
Enter A
Leave A
Leave D
Leave E
(<class '__main__.E'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.D'>, <class '__main__.A'>, <class 'object'>)

2. 使用 super(本类,self).父类方法() 的方式继承

class A:
    def __init__(self):
        print("Enter A")
        print("Leave A")

class B(A):
    def __init__(self):
        print("Enter B")
        super(B, self).__init__()
        print("Leave B")

class C(A):
    def __init__(self):
        print("Enter C")
        super(C, self).__init__()
        print("Leave C")

class D(A):
    def __init__(self):
        print("Enter D")
        super(D, self).__init__()
        print("Leave D")

class E(B, C, D):
    def __init__(self):
        print("Enter E")
        super(E, self).__init__()
        print("Leave E")

E()
print(E.__mro__)

# 结果为:
Enter E
Enter B
Enter C
Enter D
Enter A
Leave A
Leave D
Leave C
Leave B
Leave E
(<class '__main__.E'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.D'>, <class '__main__.A'>, <class 'object'>)

在python3中以上两种继承方式的方法执行顺序相同,根据E.__mro__返回值,继承顺序如下图:

1547528484953.png

但可以看到实例化E后的结果不同,前者按深度优先原则,后者按广度优先原则,所以super保证了公共父类只执行一次

相关文章

网友评论

    本文标题:python:super()对多继承的影响

    本文链接:https://www.haomeiwen.com/subject/kcxydqtx.html