day19 Python MRO詳細計算例題

2022-07-14 11:54:21 字數 3176 閱讀 8244

# 計算h的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 m(f, e):

pass

class n:

pass

class p(m, n):

pass

class g(p):

pass

class o:

pass

class x(o):

pass

class h(g, x, f):

pass

"""# 我們設c3演算法是l(x) , 即給出x類. 找到x的mro

l(h) = h + l(g) + l(x) + l(f) + (gxf)

l(g) = g + l(p) + (p,)

l(x) = x + l(o) + (o,)

l(f) = f + l(d) + l(e) + (de,)

l(p) = p + l(m) + l(n) + (mn,)

l(o) = o

l(d) = d + l(b) + l(c) + (bc,)

l(e) = e + l(c) + l(a) + (ca,)

l(m) = m + l(f) + l(e) + (fe,)

l(c) = c + l(a) + (a,)

l(b) = b + l(a) + (a,)

l(a) = a

l(n) = n

# 繼續替換

l(a) = a

l(b) = b + l(a) + (a,) --> (b,a,)

l(c) = c + l(a) + (a,) --> (c,a,)

l(d) = d + l(b) + l(c) + (b,c,) --> (d,) + (b,a) + (c,a) + (b,c) --> (d,b,c,a,)

l(e) = e + l(c) + l(a) + (c,a,) --> (e,) + (c,a) + (a,) + (c,a) --> (e,c,a,)

l(f) = f + l(d) + l(e) + (d,e,) --> (f,) + (d,b,c,a) + (e,c,a) + (d,e) --> (f,d,b,e,c,a,)

l(m) = m + l(f) + l(e) + (f,e,) --> (m,) + (f,d,b,e,c,a) + (e,c,a) + (f,e) --> (m,f,d,b,e,c,a,)

l(n) = (n,)

l(p) = p + l(m) + l(n) + (m,n,) --> (p,) + (m,f,d,b,e,c,a) + (n,) + (m,n) --> (p,m,f,d,b,e,c,a,n,)

l(x) = x + l(o) + (o,) --> (x,o,)

l(g) = g + l(p) + (p,) --> (g,) + (p,m,f,d,b,e,c,a,n) + (p,) --> (g,p,m,f,d,b,e,c,a,n,)

l(h) = h + l(g) + l(x) + l(f) + (g,x,f) --> (h,) + (g,p,m,f,d,b,e,c,a,n) + (x,o) + (f,d,b,e,c,a) + (g,x,f) --> \

# 這裡詳細解釋步驟

第一步: 判斷元組第一項元素和後面所有的元祖除第一項之外的其他項元素做比較,如果此元素不存在,則移除這個元素,加入到mro表中;如果不存在,則跳過這個元素繼續下面步驟二;

第二步: 從下乙個元祖的第一項元素和後面每個元祖除第一項之外的元素做比較,如果不存在則重複此步驟;如果存在則將此元素拿出來放到mro表中,並繼續執行步驟三;

第三部: 回到第乙個元祖,繼續步驟一;

例項: 繼續計算上門l(h)的mro順序

l(h) = (h,) + (g,p,m,f,d,b,e,c,a,n) + (x,o) + (f,d,b,e,c,a) + (g,x,f)

mro =

a). 元祖中第乙個元素h,在後面所有元祖中都不存在,因此直接拿出來放到mro中;

mro = [h,]

l(h) = (g,p,m,f,d,b,e,c,a,n) + (x,o) + (f,d,b,e,c,a) + (g,x,f)

b). 新的l(h)中 第乙個元祖的第乙個項 g,在後面的元祖除第一項元素之外的其他元素中,沒有找到g元素,因此拿出來放到mro中,然後移除所有的g,生成新的l(h)

mro = [h,g]

l(h) = (p,m,f,d,b,e,c,a,n) + (x,o) + (f,d,b,e,c,a) + (x,f)

c). 新的l(h)中 第乙個元祖的第乙個項 p,在後面的元祖除第一項元素之外的其他元素中,沒有找到p元素,因此拿出來放到mro中,然後移除所有的p,生成新的l(h)

mro = [h,g,p]

l(h) = (m,f,d,b,e,c,a,n) + (x,o) + (f,d,b,e,c,a) + (x,f)

d). 新的l(h)中 第乙個元祖的第乙個項 m,在後面的元祖除第一項元素之外的其他元素中,沒有找到m元素,因此拿出來放到mro中,然後移除所有的m,生成新的l(h)

mro = [h,g,p,m]

l(h) = (f,d,b,e,c,a,n) + (x,o) + (f,d,b,e,c,a) + (x,f)

e). 新的l(h)中 第乙個元祖的第乙個項 f ,在最後的乙個元祖中找到了,那麼此時跳過f元素,從第二個元祖(x,o) 的第乙個元素x開始和後面的元祖除第乙個元素的其他元素做比較;x在其他元祖中沒有發現,因此加入到mro中,移除所有的x,形成新的l(h)

mro = [h,g,p,m,x]

l(h) = (f,d,b,e,c,a,n) + (o) + (f,d,b,e,c,a) + (f)

f). 回到第乙個元祖,拿到第一項元素f,繼續和後面比較,重複上面的步驟最終可以拿到最終結果

mro = [h,g,p,m,x,f,d,b,e,c,a,n,o]

最終得到h的mro順序是: h,g,p,m,x,f,d,b,e,c,a,n,o

"""# 驗證結果正確

print(h.__mro__)

每日演算法 day 19

那些你早出晚歸付出的刻苦努力,你不想訓練,當你覺的太累了但還是要咬牙堅持的時候,那就是在追逐夢想,不要在意終點有什麼,要享受路途的過程,或許你不能成就夢想,但一定會有更偉大的事情隨之而來。mamba out 2020.3.2 先將十六進製制轉化為二進位制 二進位制每四位可以表示乙個十六進製制的數字 ...

day19 學習總結

今天學習了陣列的使用和多維陣列。下面是知識點 package com.liangwenwei.陣列 public class 陣列的使用 列印全部陣列元素 for int i 0 i arrays.length i system.out.println 列印全部陣列元素 for int array ...

Day19 兩數相除

返回被除數 dividend 除以除數 divisor 得到的商。整數除法的結果應當截去 truncate 其小數部分,例如 truncate 8.345 8 以及 truncate 2.7335 2 示例1 輸入 dividend 10,divisor 3 輸出 3 解釋 10 3 truncat...