一 . 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'>,