mro案例:
classa:
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,先將每個類的mro表示出來
比如我要找h這個類的mro是什麼,我先找到每個類的mro後,再進行反向的計算
每個類的mro
例如'''l(h) = h + l(g) + l(f)
# 這裡可以看到,h是繼承了g和f的,這裡使用深度優先遍歷,我先找完l(g) 這邊的mro
l(g) = g + l(e)
l(e) = e + l(c) + l(a)
l(c) = c + l(a)
l(a)=a
# 我再找l(f)這邊,也是使用深度優先遍歷
l(f)=f + l(d)+ l(e)
l(d) = d + l(b) + l(c)
l(b) = b + l(a)
# 這樣我就計算出來每乙個類的mro了,為了方便後續計算我將這兩個部分按照順序排序下便於計算
'''
# 排序後
#排序後l(h) = h + l(g) +l(f)
l(g) = g +l(e)
l(f)=f + l(d)+l(e)
l(e) = e + l(c) +l(a)
l(d) = d + l(b) +l(c)
l(c) = c +l(a)
l(b) = b +l(a)
l(a)=a
#因此計算的方法可以將l(a)=a 反向代入進行計算,
#把l(a) 往⾥帶. 再推回去. 但要記住. 這⾥的
#+ 表⽰的是merge. merge的原則是⽤每個元組的頭⼀項和後⾯元組的除頭⼀項外的其他元
#素進⾏比較, 看是否存在. 如果存在. 就從下⼀個元組的頭⼀項繼續找. 如果找不到. 就拿出來.
#作為merge的結果的⼀項. 以此類推. 直到元組之間的元素都相同. 也就不⽤再找了.
l(a)=a
l(b) = b + l(a) ----> l(b)=b+a--> l(b)=ba
l(c) = c + l(a) ----> l(c)=c+a--> l(c)=ca
l(d) = d + l(b) + l(c) ----> l(d)=d+ba+ca ---> l(d)=dbca
l(e) = e + l(c) + l(a) ---->l(e) = e+ca+a ---> l(e)=e, c, a
l(f)=f + l(d)+ l(e) ----->l(f)=f, d, b, e, c, a
l(g) = g + l(e) ----> l(g)=g, e, c, a
l(h) = h + l(g) + l(f) ---->l(h) = (h, ) + (g, e, c, a) + ( f, d, b, e, c, a) -> h, g, f, d, b, e, c, a
mro之C3演算法
c3演算法 歸併演算法 class a object pass class b a pass class c a pass class d b pass class e c pass class f d,e pass print f.mro 第一步先找到繼承的父類的mro d d,b,a,o e e...
python之路 MRO和C3演算法
多繼承的一種方法,一種查詢的順序 在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 ...
day021 MRO和c3演算法
一.python的繼承.多繼承 子類繼承父類.為什麼要繼承?為了節省開發時間.調高開發效率.得到了重用 在python中存在多繼承 mro method resolution order 方法路徑順序.python2 1.使用經典類 寫繼承關係的時候.基類不繼承object 2.新式類 繼承關係的根...