1. 程式人生 > >day19 Python MRO詳細計算例題

day19 Python MRO詳細計算例題

# 計算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__)