python mro c3_python之路--MRO和C3算法

一 . MRO(method resolution order)

多繼承的一種方法,一種查找的順序

在python3 里面是一種新類式MRO 需要用都的是C3算法

classA:pass

classB(A):pass

classC(A):pass

classD(B, C):pass

classE(C, A):pass

classF(D, E):pass

classG(E):pass

classH(G, F):pass

首先. 我們要確定從H開始找. 也就是說. 創建的是H的對象.

如果從H找. 那找到H+H的父類的C3, 我們設C3算法是L(x) , 即給出x類. 找到x的MRO.

L(H) = H + L(G) + L(F) + GF

繼續從代碼中找G和F的⽗類往⾥⾯帶

L(G) = G + L(E) + E

L(F) = F + L(D)+ L(E) + DE

繼續找E 和 D

L(E) = E + L(C) + L(A) + CA

L(D) = D + L(B) + L(C) + BC

繼續找B和C

L(B) = B + L(A) + A

L(C) = C + L(A) + A

最后就剩下⼀個A了. 也就不⽤再找了. 接下來. 把L(A) 往⾥帶. 再推回去. 但要記住.

這⾥的 + 表⽰的是merge. merge的原則是⽤每個元組的頭⼀項和后⾯元組的除頭⼀項外的其他元素進⾏比較, 看是否存在.

如果存在. 就從下⼀個元組的頭⼀項繼續找. 如果找不到. 就拿出來.作為merge的結果的⼀項. 以此類推. 直到元組之間的元素都相同. 也就不⽤再找了.

L(B) =(B,) + (A,) + (A) -> (B, A)

L(C) =(C,) + (A,) + (A) -> (C, A)

繼續帶.

L(E) = (E,) + (C, A) + (A) + (C,A) -> E, C, A

L(D) = (D,) + (B, A) + (C, A) + (B, C) -> D, B, C, A

繼續帶.

L(G) = (G,) + (E, C, A) + (E) -> G, E, C, A

L(F) = (F,) + (D, B, C, A) + (E, C, A) + (D, E)-> F, D, B, E, C, A

加油, 最后了

L(H) = (H, ) + (G, E, C, A) + ( F, D, B, E, C, A) + (G, F) -> H, G, F, D, B, E, C, A

算完了. 最終結果 HGFDBECA. 那這個算完了. 如何驗證呢? 其實python早就給你准備好了. 我們可以使⽤類名.__mro__獲取到類的MRO信息.

print(H.__mro__) 結果: (, , ,

'__main__.D'>, , ,

'__main__.C'>,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值