python多重继承 MRO

首先取得head元素, 如果这个元素不出现在后面任何一个列表的tail中, 我们就将其加到线性化表示中,并且从待merge的列表中删除, 否则, 我们探查下一个head元素, 按这种方式进行下去, 直到我们移除了所有的元素或者我们没办法进行下一步。若没法进行下一步, 即表示我们没有办法构建此线性化表示, python会拒绝创建此类并抛出一个TypeError异常


例子:

class A(O):pass
class B(O):pass
class C(O):pass
class E(A,B):pass
class F(B,C):pass
class G(E,F):pass



mro(E) = [E] + merge(mro(A), mro(B), [A,B])
       = [E] + merge([A,O], [B,O], [A,B])
       = [E,A] + merge([O], [B,O], [B])
       = [E,A,B] + merge([O], [O])
       = [E,A,B,O]


mro(F) = [F] + merge(mro(B), mro(C), [B,C])
       = [F] + merge([B,O], [C,O], [B,C])
       = [F,B] + merge([O], [C,O], [C])
       = [F,B,C] + merge([O], [O])
       = [F,B,C,O]


mro(G) = [G] + merge(mro[E], mro[F], [E,F])
       = [G] + merge([E,A,B,O], [F,B,C,O], [E,F])
       = [G,E] + merge([A,B,O], [F,B,C,O], [F])
       = [G,E,A] + merge([B,O], [F,B,C,O], [F])
       = [G,E,A,F] + merge([B,O], [B,C,O])
       = [G,E,A,F,B] + merge([O], [C,O])
       = [G,E,A,F,B,C] + merge([O], [O])
       = [G,E,A,F,B,C,O]
       

产生TypeError:

class A(object):  
    pass
  
class B(object):  
    pass  
  
class X(A,B):  
    pass
  
class Y(B,A):  
    pass  
  
class Z(X,Y):
    pass

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值