python之路 MRO和C3演算法

2022-09-01 21:33:24 字數 1783 閱讀 7667

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

在python3 裡面是一種新類式mro 需要用都的是c3演算法

class

a:

pass

class

b(a):

pass

class

c(a):

pass

class

d(b, c):

pass

class

e(c, a):

pass

class

f(d, e):

pass

class

g(e):

pass

class

h(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__.h

'>, '__main__.g

'>, '__main__.f

'>, '__main__.d

'>, '__main__.b

'>, '__main__.e

'>, '__main__.c

'>,'__main__

Python的多重繼承問題 MRO和C3演算法

有乙個sina的blog介紹的很好 python 多重繼承mro mro即method resolution order,主要用於在多繼承時判斷調的屬性的路徑 來自於哪個類 之前檢視了很多資料,說mro是基於深度優先搜尋演算法的。但不完全正確在python2.3之前是基於此演算法,但從python2...

mro和c3 演算法

mro案例 class a pass class b a pass class c a pass class d b,c pass class e c,a pass class f d,e pass class g e pass class h g,f pass 計算方法 先將每乙個類的繼承mro,...

Python 19 MRO和C3演算法

經典類的mro 新式類的mro class a pass class b a pass class c a pass class d b,c pass class e c,a pass class f d,e pass class g e pass class h g,f pass print h....