05 Python MRO及c3演算法

2022-05-18 15:08:03 字數 2328 閱讀 5072

1. 了解python2和python3類的區別

python2在2.3之前使用的是經典類, 2.3之後, 使用的是新式類

2. 經典類的mro 樹形結構的深度優先遍歷 -> 樹形結構遍歷

從左到右,深度遞迴,一直到頭再返回

foo -> h -> g -> d -> b -> a -> c -> e

3. 新式類的mro c3演算法

拿第一項的第一位和 後面每項的除了第一位比較. 如果沒有出現, 則該位元素算出如果出現了. 此時開始下一項的第一位繼續和後面每一項的除了第一位比較:

用頭和身體比較

方法:   1. 拆分

2. 合併

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

l(h) = h + l(g) + l(f) + gf # eca + dbeca  = hgfdbecao

l(g) = g + l(e) + e # geca

l(e) = e + l(c) + l(a) + ca # eca

l(c) = c + l(a) + a # ca

l(a) = a

l(f) = f + l(d) + l(e) + de # fdbeca

l(d) = d + l(b) + l(c) + bc # dbca

l(b) = b + a + a # ba

與python中使用h.__mro__執行的結果相同

(

'__main__.h

'>,

'__main__.g

'>,

'__main__.f

'>,

'__main__.d

'>, <

class

'__main__.b

'>,

'__main__.e

'>,

'__main__.c

'>,

'__main__.a

'>,

'object

'>)

4. super() 找mro順序的下乙個
class

base1:

defchi(self):

super().chi()

print("

base1")

class

base2:

defchi(self):

super().chi()

print("

base2")

class

base3:

defchi(self):

print("

base3")

class

bar(base1, base2, base3):

defchi(self):

print("

bar裡chi1")

super(bar, self).chi()

print("

bar裡chi2")

b = bar()

結果 :bar裡chi1,base3,base2,base1,bar裡chi2

C 學習筆記05

這下面的程式段是字元反輸出的例子,自己寫的,不過又出錯了,找了nnnn久,終於找到了錯誤,可惡啊,字串第乙個字元是0,時刻提醒著自己,卻在關鍵時刻忘記了.static void main string args static void main string args 用yes替換字串中的no,不過...

C語言05 函式及函式的呼叫過程

函式呼叫過程 集中處理非常樸素的道理,實踐以下 變參函式的話題。有意義機器碼 通過反彙編視窗確認 另外,也可以從列印函式名確認 void funtest void funvalarg char arg1,void myaddval int main int argc,char ar 作業系統為了好管...

C 05 goto模擬迴圈及函式的底層原理

int n 1 int nsum 0 dowhile n 100 do begin nsum nsum n n if n 100 int n 1 int nsum 0 while n 100 while begin if n 100 nsum nsum n n goto while begin wh...