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順序中找當前執行類的下一個類中的某個方法.