1. 瞭解python2和python3類的區別 python2在2.3之前使用的是經典類, 2.3之後, 使用的是新式類 2. 經典類的MRO 樹形結構的深度優先遍歷 -> 樹形結構遍歷 從左到右,深度遞歸,一直到頭再返回 Foo -> H -> G -> D -> B -> A -> C -> ...
1. 瞭解python2和python3類的區別
python2在2.3之前使用的是經典類, 2.3之後, 使用的是新式類
2. 經典類的MRO 樹形結構的深度優先遍歷 -> 樹形結構遍歷
class A: pass class B(A): pass class C(A): pass class D(B, C): pass class E: pass class F(D, E): pass class G(F, D): pass class H: pass class Foo(H, G): pass
從左到右,深度遞歸,一直到頭再返回
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__運行的結果相同
(<class '__main__.H'>, <class '__main__.G'>, <class '__main__.F'>, <class '__main__.D'>, <
class '__main__.B'>, <class '__main__.E'>, <class '__main__.C'>, <class '__main__.A'>,
<class 'object'>)
4. super() 找MRO順序的下一個
class Base1: def chi(self): super().chi() print("Base1") class Base2: def chi(self): super().chi() print("Base2") class Base3: def chi(self): print("Base3") class Bar(Base1, Base2, Base3): def chi(self): print("Bar里chi1") super(Bar, self).chi() print("Bar里chi2") b = Bar()
結果 :Bar里chi1,Base3,Base2,Base1,Bar里chi2