python多重继承,优先级
python多重继承
概念:
1.经典类: 申明的时候,没有继承于object,多重继承的时候,会按照深度优先方式查找
2.新式类:申明的时候,继承于object,多重继承的时候,会按照广度优先方式查找
但是!! python3之后默认所有的无论是否继承object,都默认 继承object,即python3中所有类均为新式类
所以得出结论,python3中的多重继承都是遵循广度优先的方式
class D(): pass class E(): pass class F(): pass class C(D, F): pass class B(E, D): pass class A(B, C): pass if __name__ == '__main__': print( A.__mro__)
输出的是(<class '__main__.A'>, <class '__main__.B'>, <class '__main__.E'>, <class '__main__.C'>, <class '__main__.D'>, <class '__main__.F'>, <class 'object'>)
排序方法:
mro顺序采用的是C3算法,了解参考:https://www.jianshu.com/p/6651ed35104c
先根据集成的左右优先级顺序画出图,然后先找到入度为0的,即:A,然后把A的所有链接点删除,从左到右找到
入度为0的,即:B,同理划掉B的所有连接点,下一个入度为0的就是E和C,所以下一个是E,继续同理下去就能得到上述输出结果了。
super()
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'>)
梳理一下流程:
1.先执行E中的打印语句 ENTER,然后走到了第一个super()
2.根据继承关系,这里先走到B中,执行完B中的ENTER 打印语句后,又是一个super()继承,所以走到C中,执行C的ENTER语句所以这里是关键,是走到C而不是看BC没有任何继承关系而去走到D
这里是按照__mro__顺序严格执行的,后续就是一步一步的执行输出如上