Python-37章 MRO

Python2和Python3之間的區別

Python2.4之前使用的是經典類,2.4之後使用的是新式類
經典類繼承

MRO method resolution order 方法的查詢順序

經典類的MRO : 樹形結構的深度優先遍歷

執行過程中會依次從左到右,深度遞歸,向上尋找繼承關係,依次順藤摸瓜找上去
在這裏插入圖片描述
此時的執行順序:G->C->A->B->F->D->E
從左向右依次尋找.並且經典類不會重複尋找,深度優先會先將一條分支走到頭,然後再去找下一個分支.
由於現在已經淘汰了Python2,所以瞭解下就好

新式類的MRO: C3算法

Python不存在廣度優先,並且廣度優先是很慢的

拆分
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
# 求H的 MRO
'''
Python3中所有的類都默認繼承object
    設求MRO的算法是L
    L(H) = H + L(G) + L(F) + GF
    L(G) = G + L(E) + E
    L(E) = E + L(C) + L(A) + CA
    L(C) = C + L(A) + A
    L(A) = A
    L(F) = F + L(D) + L(E) + DE
    L(D) = D + L(B) + L(C) + BC
    L(B) = B + L(A) + A
    
    加法:merge()
    DBCA + ECA => D
    # 拿第一項的第一位和後面每項的除了第一位進行比較,如果沒有出現,則該位元素被算出
    BCA + ECA => B
    #如果出現了,此時,繼續開始下一項的第一位(第一項的C在第二項出現了,開始第二項的第一位,但是第二項後面沒有了,輸出E)
    CA + ECA => E
    CA + CA => CA
結果:DBECA
'''
合併
    L(H) = H + L(G) + L(F) + GF
    L(G) = G + L(E) + E
    L(E) = E + L(C) + L(A) + CA
    L(C) = C + L(A) + A
    L(A) = A
    L(F) = F + L(D) + L(E) + DE
    L(D) = D + L(B) + L(C) + BC
    L(B) = B + L(A) + A

從下向上算

L(B) = B + L(A) + A --> L(B) + B + A + A => BA
# L(B) 計算L(B),結果是BA
#當遇到計算出一種後就將前面未計算中的相同的全部刪除
#D在後面沒有出現,全部輸出,前面刪除所有的D.此時:BA + CA + BC => D
#計算B,後面的身子(除第一位)沒有出現,輸出,此時:A + CA + C =>DB
#計算A,後面有出現,計算下一個的頭(C),後面身子沒有出現,輸出,此時 A + A =>DBC
#只剩下A,輸出
L(D) = D + L(B) + L(C) + BC --> L(D) + D + BA + CA + BC => DBCA 

L(F) = F + L(D) + L(E) + DE --> F + DBCA + ECA + DE =>FDBECA

L(A) = A

L(C) = C + L(A) + A --> CA

L(E) = E + L(C) + L(A) + CA  --> ECA

L(G) = G + L(E) + E  -->GECA
#此時計算最後的,將前面的都拿過來
L(H) = H + L(G) + L(F) + GF --> H + GECA + FDBECA + GF => HGFDBECA
#最後加上object,此時:HGFDBECAobject
print(H.__mro__)
# 計算mro,查看順序

super

super(類名,self):在當前MRO順序中找當前執行類的下一個類中的某個方法.

發佈了130 篇原創文章 · 獲贊 11 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章