一个子类继承两个或两个以上的父类,父类中的属性和方法同时被子类继承下来。
当多个父类中存在同名的方法时,子类该继承那个父类的方法呢?
为了避免多继承造成的混乱局面,python采用MRO(Method Resolution Order)来决定子类同名方法的解析顺序:
我们可以调用__mro__方法查看解析的顺序:
class D(object):
pass
class E(object):
pass
class F(object):
pass
class C(D, F):
pass
class B(E, D):
pass
class A(B, C):
pass
if __name__ == '__main__':
print A.__mro__
result:
(<class '__main__.A'>, <class '__main__.B'>, <class '__main__.E'>, <class '__main__.C'>, <class '__main__.D'>, <class '__main__.F'>, <type 'object'>)
下面是根据上面代码抽象出来的继承关系图:
MRO解析顺序采用C3算法,类似于拓扑排序(每次找到一个只指向别人的点,记录下来;然后忽略掉这个点和它所指出去的线,再找到下一个只指向别人的点,记录下来,直到剩最后一个点,所有记录的点的顺序就是拓扑顺序),C3算法在遇到同时有多个指向别人的点时按照从左到右的顺序选择。比如我们这里:
1,A满足只指向别人,选择A,然后去掉A
2,B,C同时满足只指向别人,则按从左到右的顺序选择B,然后去掉B
3,E,C同时满足只指向别人,则按从左到右的顺序选择E,然后去掉E
4,C满足只指向别人,选择C,然后去掉C
5,D,F同时满足只指向别人,则按从左到右的顺序选择D,然后去掉D
6,F满足只指向别人,选择F,然后去掉F
7,选择object
选择顺序是:A–>B–>E–>C–>D–>F–>object,和__mro__方法输出的解析顺序是一致的。