Python中多继承的查找顺序MRO

一个子类继承两个或两个以上的父类,父类中的属性和方法同时被子类继承下来。
当多个父类中存在同名的方法时,子类该继承那个父类的方法呢?
为了避免多继承造成的混乱局面,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__方法输出的解析顺序是一致的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值