91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python的多繼承C3算法解析

發布時間:2020-09-21 09:40:14 來源:億速云 閱讀:256 作者:Leah 欄目:編程語言

本篇文章給大家分享的是有關Python的多繼承C3算法解析,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

Python多繼承MRO

在Python2.1中,采用了經典類,使用深度優先算法解析。

Python2.2中,引入了新式類,使用深度優先算法和廣度優先算法。

在Python2.3以后的版本中,經典類和新式類共存,使用了DFS算法和C3算法。

Python2中的經典類

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).

這是維基百科中的定義,下面這張圖是一張多繼承的關系圖:

Python的多繼承C3算法解析

那么這里的mro解析順序是如何的呢?單純看圖很難得出答案。

C3線性算法的推導過程如下:

假設類C繼承自父類B1,...Bn,類C的解析列表公式如下:

Python的多繼承C3算法解析

這個公式表明C的解析列表是通過對其所有父類的解析列表及其父類一起merge得到的。

merge操作分為如下幾個步驟:

1.選取merge中的第一個列表記為當前列表K。

2.令h = head(K), 如果h沒有出現在其他任何列表的tail(列表中除了第一個元素,其余的稱之為tail)當中,那么將其加入類C的線性化列表中,并將其從merge中的所有列表移除,之后重復步驟2。

3.否則,設置K為merge的下一個列表,重復2中的操作。

4.如果merge的所有類都被移除,則輸出類創建成功;如果不能找到下一個h,則輸出C類拋出異常。

推導過程

我們用上面的那張圖試一下推導出mro的解析順序。

上面那張圖轉換為python代碼如下:

轉換成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())

推導

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的推導過程
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中運行

print(Z.mro())

結果如下

[<class '__main__.Z'>, <class '__main__.K1'>, <class '__main__.K2'>, <class '__main__.K3'>, <class '__main__.D'>,
<class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.E'>, <class 'object'>]

和我們推導的結果相同,這就是C3算法的流程。

以上就是Python的多繼承C3算法解析,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

潮安县| 新竹市| 郯城县| 红河县| 呼伦贝尔市| 武夷山市| 香港| 岢岚县| 清徐县| 历史| 龙岩市| 乌什县| 龙南县| 高平市| 浦县| 碌曲县| 阿鲁科尔沁旗| 游戏| 星座| 辽宁省| 桦南县| 利川市| 霍城县| 黔南| 五家渠市| 延吉市| 沈阳市| 静宁县| 高台县| 威远县| 广宁县| 闽清县| 芮城县| 华蓥市| 襄樊市| 萝北县| 格尔木市| 贵州省| 余干县| 屏东县| 西峡县|