mro和c3 演算法

2022-07-21 23:39:15 字數 1781 閱讀 9288

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,先將每個類的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.新式類 繼承關係的根...