python mro c3_Python 19 MRO和C3算法
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)題。
- 上一篇: java原生的ajax怎么写_原生Aja
- 下一篇: python函数时间,python之时间