創(chuàng)新互聯(lián)www.cdcxhl.cn八線動態(tài)BGP香港云服務(wù)器提供商,新人活動買多久送多久,劃算不套路!
在歷下等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計 網(wǎng)站設(shè)計制作定制網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),全網(wǎng)整合營銷推廣,外貿(mào)網(wǎng)站建設(shè),歷下網(wǎng)站建設(shè)費(fèi)用合理。本篇文章給大家分享的是有關(guān)Python的多繼承C3算法解析,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
Python多繼承MRO
在Python2.1中,采用了經(jīng)典類,使用深度優(yōu)先算法解析。
Python2.2中,引入了新式類,使用深度優(yōu)先算法和廣度優(yōu)先算法。
在Python2.3以后的版本中,經(jīng)典類和新式類共存,使用了DFS算法和C3算法。
Python2中的經(jīng)典類
class A(object): pass
Python3的新式類
class A: pass
C3算法
In computing, the C3 superclass linearization is an algorithm used primarily to obtain the order in which methods should be inherited (the "linearization") in the presence of multiple inheritance, and is often termed Method Resolution Order (MRO).
這是維基百科中的定義,下面這張圖是一張多繼承的關(guān)系圖:
那么這里的mro解析順序是如何的呢?單純看圖很難得出答案。
C3線性算法的推導(dǎo)過程如下:
假設(shè)類C繼承自父類B1,...Bn,類C的解析列表公式如下:
這個公式表明C的解析列表是通過對其所有父類的解析列表及其父類一起merge得到的。
merge操作分為如下幾個步驟:
1.選取merge中的第一個列表記為當(dāng)前列表K。
2.令h = head(K), 如果h沒有出現(xiàn)在其他任何列表的tail(列表中除了第一個元素,其余的稱之為tail)當(dāng)中,那么將其加入類C的線性化列表中,并將其從merge中的所有列表移除,之后重復(fù)步驟2。
3.否則,設(shè)置K為merge的下一個列表,重復(fù)2中的操作。
4.如果merge的所有類都被移除,則輸出類創(chuàng)建成功;如果不能找到下一個h,則輸出C類拋出異常。
推導(dǎo)過程
我們用上面的那張圖試一下推導(dǎo)出mro的解析順序。
上面那張圖轉(zhuǎn)換為python代碼如下:
轉(zhuǎn)換成Python代碼
O = object class A(O): pass class B(O): pass class C(O): pass class D(O): pass class E(O): pass class K1(A, B, C): pass class K2(D, B, E): pass class K3(D, A): pass class Z(K1, K2, K3): pass print(Z.mro())
推導(dǎo)
L(K1) = K1 + merge(L[A],L[B],L[C],(A,B,C)) = K1 + merge(L[A,O],L[B,O],L[C,O],(A,B,C)) = [K1,A] + merge(L[O],L[B,O],L[C,O],(B,C)) = [K1,A,B] + merge(L[O],L[O],L[C,O],(C)) = [K1,A,B,C] + merge(L[O],L[O],L[O]) = [K1,A,B,C,O] L(K2) = [K2,D,B,E,O] L(K3) = [K3,D,A,O] 以上是K1,K2,K3的解析順序 下面是Z的推導(dǎo)過程 L(Z) = Z + merge(L(K1)+L(K2)+L[K3],(K1,K2,K3)) = Z + merge(L[K1,A,B,C,O]+L(K2,D,B,E,O)+L(K3,D,A,O),(K1,K2,K3)) = [Z,K1] + merge(L[A,B,C,O]+L(K2,D,B,E,O)+L(K3,D,A,O),(K2,K3)) = [Z,K1,K2] + merge(L[A,B,C,O]+L(D,B,E,O)+L(K3,D,A,O),(K3)) = [Z,K1,K2,K3] + merge(L[A,B,C,O]+L(D,B,E,O)+L(D,A,O)) = [Z,K1,K2,K3,D] + merge(L[A,B,C,O]+L(B,E,O)+L(A,O)) = [Z,K1,K2,K3,D,A] + merge(L[B,C,O]+L(B,E,O)+L(O)) = [Z,K1,K2,K3,D,A,B] + merge(L[C,O]+L(E,O)+L(O)) = [Z,K1,K2,K3,D,A,B,C] + merge(L[O]+L(E,O)+L(O)) = [Z,K1,K2,K3,D,A,B,C,E,O]
我們得出的最終答案為:Z的解析順序:Z->K1->K2->K3->D->A->B->C->E->O
為了驗證答案,我們在python中運(yùn)行
print(Z.mro())
結(jié)果如下
[, , , , , , , , , ]
和我們推導(dǎo)的結(jié)果相同,這就是C3算法的流程。
以上就是Python的多繼承C3算法解析,小編相信有部分知識點(diǎn)可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道。