日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python mro c3_Python 19 MRO和C3算法

發(fā)布時(shí)間:2024/7/23 python 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python mro c3_Python 19 MRO和C3算法 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1.python經(jīng)典類的MRO

經(jīng)典類的MRO

class A: pass class B(A): pass class C(A): pass class D(B, C): pass class E: pass class F(D, E): pass class G(F, D): pass class H: pass class Foo(H, G): pass

enter description here

2. python新式類的MRO, C3算法

新式類的MRO

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開(kāi)始找. 也就是說(shuō). 創(chuàng)建的是H的對(duì)象.

如果從H找. 那找到H+H的?類的C3, 我們?cè)O(shè)C3算法是L(x) , 即給出x類. 找到x的MRO

L(H) = H + L(G) + L(F)

繼續(xù)從代碼中找G和F的?類往??帶

L(G) = G + L(E)

L(F) = F + L(D)+ L(E)

繼續(xù)找E 和 D

L(E) = E + L(C) + L(A)

L(D) = D + L(B) + L(C)

繼續(xù)找B和C

L(B) = B + L(A)

L(C) = C + L(A)

最后就剩下一個(gè)A了. 也就不用再找了. 接下來(lái). 把L(A) 往回帶. 再推回去. 但要記住. 這?的

表示的是merge. merge的原則是?每個(gè)元組的頭一項(xiàng)和后一元組的除頭一項(xiàng)外的其他元

素進(jìn)行比較, 看是否存在. 如果存在. 就從下一個(gè)元組的頭一項(xiàng)繼續(xù)找. 如果找不到. 就拿出來(lái).

作為merge的結(jié)果的一項(xiàng). 以此類推. 直到元組之間的元素都相同. 也就不?再找了.

L(B) =(B,) + (A,) -> (B, A)

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

繼續(xù)帶.

L(E) = (E,) + (C, A) + (A) -> E, C, A

L(D) = (D,) + (B, A) + (C, A) -> D, B, A

繼續(xù)帶.

L(G) = (G,) + (E, C, A) -> G, E, C, A

L(F) = (F,) + (D, B, A) + (E, C, A) -> F, D, B, E, C, A

加油,

算完了. 最終結(jié)果 HGFDBECA. 那這個(gè)算完了. 如何驗(yàn)證呢? 其實(shí)python早就給你準(zhǔn)備好

了. 我們可以使用類名.__mro__獲取到類的MRO信息

print(H.__mro__)

結(jié)果:

(, , ,

‘__main__.D‘>, , , ,, )

3. super是什么?

super()可以幫我們執(zhí)行MRO中下一個(gè)父類的方法. 通常super()有兩個(gè)使用的地方:

可以訪問(wèn)父類的構(gòu)造方法

當(dāng)子類方法想調(diào)用父類(MRO)中的方法

方法一

class Foo: def __init__(self, a, b, c): self.a= a

self.b = b

self.c = c

class Bar(Foo): def __init__(self, a, b, c, d): super().__init__(a, b, c) # 訪問(wèn)父類的構(gòu)造方法 self.d= d

b = Bar(1, 2, 3, 4)

print(b.__dict__)

結(jié)果:

{‘a(chǎn)‘: 1, ‘b‘: 2, ‘c‘: 3, ‘d‘: 4}

方法二

class Foo: def func1(self): super().func1() # 此時(shí)找的是MRO順序中下?個(gè)類的func1()方法 print("我的家. 就住在這個(gè)屯") class Bar: def func1(self): print("你的家. 不在這個(gè)屯") class Ku(Foo, Bar): def func1(self): super().func1() # 此時(shí)super找的是Foo print("他的家. 不知道在哪個(gè)屯") k= Ku() # 先看MRO . KU, FOO, BAR object

k.func1()

k2 = Foo() # 此時(shí)的MRO. Foo object

k2.func1() # 報(bào)錯(cuò)

總結(jié)

以上是生活随笔為你收集整理的python mro c3_Python 19 MRO和C3算法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。