1. 程式人生 > >python MRO及c3演算法

python MRO及c3演算法

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