Python3中的MRO C3算法

我們知道python中的類與類之間是可以相互繼承的。在繼承關(guān)系中万皿,子類自動(dòng)擁有父類中除了私有屬性之外的其他所有內(nèi)容。python中支持多繼承牢硅,也就是說一個(gè)類可以有多個(gè)父類芝雪。但是在多繼承中减余,存在這樣一個(gè)問題:當(dāng)兩個(gè)父類中出現(xiàn)重名方法的時(shí)候惩系,如何處理他們的繼承關(guān)系,即MRO(method resolution order)方法解析順序問題堡牡。

Python2中的MRO

在python2中存在兩種類:

  • 經(jīng)典類:在python2.2之前。一直使用的是經(jīng)典類晤柄。經(jīng)典類的根如果什么都不寫,表示繼承XXX芥颈。
  • 新式類:在python2.2之后出現(xiàn)了新式類。新式類的特點(diǎn)是基類的根是object

Python3中的MRO

  • python3中使用的都是新式類爬坑。如果基類誰都不繼承纠屋,那么這個(gè)類會(huì)默認(rèn)繼承object盾计。

本文只講述Python3新式類的MRO

計(jì)算公式L[C(B)] = C + merge(L[B],B) = C + L[B]

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:
    pass
class N(M):
    pass
class P(E, A):
    pass
class X:
    pass
class Q(P,N,X):
    pass
class G(Q, F):
    pass
class H(G, F):
    pass
L(H) = H + L(G) + L(F) + GF    => H + GQPFDBECANMX + FDBECA + GF    => HGQPFDBECANMX
L(G) = G + L(G) + L(F) + QF    => GQPFDBECANMX
L(Q) = Q + L(P) + L(N) + L(X) + PNX    => QPECANMX
L(X) = X    => X
L(P) = P + L(E) + L(A) + EA    => PECA
L(N) = N + L(M) + M    => NM
L(M) = M    => M
L(F) = F + L(D) + L(E) + DE    => FDBECA
L(E) = E + L(C) + L(A) + CA    => ECA
L(D) = D + L(B) + L(C) + BC    => DBCA
L(C) = C + L(A) + A    => CA
L(B) = B + L(A) + A    => BA
L(A) = A    => A
求H的MRO
    設(shè)求MRO的算法是L
    加法:merge(), 拿第一項(xiàng)的第一位和 后面每項(xiàng)的除了第一位比較. 如果沒有出現(xiàn), 則該位元素算出
        如果出現(xiàn)了. 此時(shí)開始下一項(xiàng)的第一位繼續(xù)和后面每一項(xiàng)的除了第一位比較:
        用頭和后面身體比較

上面的是手工算的MRO,其實(shí)在python中可以使用類名.mro(H.__mro__)的方式直接輸出對(duì)應(yīng)類的MRO署辉。

(<class '__main__.H'>, <class '__main__.G'>, <class '__main__.Q'>, <class '__main__.P'>,
<class '__main__.F'>, <class '__main__.D'>, <class '__main__.B'>, <class '__main__.E'>,
<class '__main__.C'>, <class '__main__.A'>, <class '__main__.N'>, <class '__main__.M'>,
<class '__main__.X'>, <class 'object'>)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市骑素,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌献丑,老刑警劉巖末捣,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件创橄,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡妥畏,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門醉蚁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人网棍,你說我怎么就攤上這事±溺瑁” “怎么了氏身?”我有些...
    開封第一講書人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵惑畴,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我如贷,道長(zhǎng),這世上最難降的妖魔是什么倒得? 我笑而不...
    開封第一講書人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮霞掺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘菩彬。我一直安慰自己,他們只是感情好骗灶,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著耙旦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上锉罐,一...
    開封第一講書人閱讀 51,698評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音脓规,去河邊找鬼。 笑死侨舆,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的挨下。 我是一名探鬼主播,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼臭笆,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了耗啦?” 一聲冷哼從身側(cè)響起机杜,我...
    開封第一講書人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤帜讲,失蹤者是張志新(化名)和其女友劉穎椒拗,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蚀苛,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年堵未,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片渗蟹。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖雌芽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情世落,我是刑警寧澤淮腾,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站谷朝,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏徘禁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一送朱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧驶沼,春花似錦、人聲如沸回怜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽翔试。三九已至复旬,卻和暖如春垦缅,著一層夾襖步出監(jiān)牢的瞬間驹碍,已是汗流浹背壁涎。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工志秃, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人浮还。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓竟坛,卻偏偏與公主長(zhǎng)得像碑定,于是被迫代替她去往敵國(guó)和親流码。 傳聞我的和親對(duì)象是個(gè)殘疾皇子延刘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容