Python中没有接口的概念,替代之的是多重继承。而引入多重继承之后,一个新的问题是多个父类之间的继承顺序和方法调用顺序。比如:子类中调用的方法在多个父类中都存在的时候,到底会调用哪个父类的方法?(显然不会把所有父类的方法都调用一遍)
理解MRO
如果把单重继承理解为是链表结构,那么多重继承则可以认为是树状结构。所以多重继承的向上搜索的规则有2种实现方式:
- 深度优先搜索(DFS)
- 广度优先搜索(BFS)
深度优先搜索图解如下:
这种查找方式的缺点:
棱形继承时可能会出现父类访问优先于子类访问。如上图中的父类D就优于子类C先被访问到。这会导致子类C中的覆盖方法无法被访问到。
广度优先搜索图解如下:
这种查找方式的缺点:
在正常继承时没有按照继承的单调性来查找。
为了解决DFS和BFS的缺陷问题,Python中使用了C3算法,经过调整之后多重继承的查找方式如下: