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__顺序严格执行的,后续就是一步一步的执行输出如上

 

posted @ 2019-04-03 14:45  Alantammm  阅读(511)  评论(0编辑  收藏  举报