python之路--MRO和C3算法

时间:2021-01-26 02:31:15

一 . MRO(method resolution order)

  多继承的一种方法,一种查找的顺序

  在python3 里面是一种新类式MRO 需要用都的是C3算法

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开始找. 也就是说. 创建的是H的对象.
如果从H找. 那找到H+H的父类的C3, 我们设C3算法是L(x) , 即给出x类. 找到x的MRO.

  L(H) = H + L(G) + L(F) + GF
  继续从代码中找G和F的⽗类往⾥⾯带
  L(G) = G + L(E) + E
  L(F) = F + L(D)+ L(E) + DE
  继续找E 和 D
  L(E) = E + L(C) + L(A) + CA
  L(D) = D + L(B) + L(C) + BC
  继续找B和C
  L(B) = B + L(A) + A
  L(C) = C + L(A) + A

最后就剩下⼀个A了. 也就不⽤再找了. 接下来. 把L(A) 往⾥带. 再推回去. 但要记住. 
  这⾥的 + 表⽰的是merge. merge的原则是⽤每个元组的头⼀项和后⾯元组的除头⼀项外的其他元素进⾏比较, 看是否存在.
    如果存在. 就从下⼀个元组的头⼀项继续找. 如果找不到. 就拿出来.作为merge的结果的⼀项. 以此类推. 直到元组之间的元素都相同. 也就不⽤再找了.

  L(B) =(B,) + (A,) + (A) -> (B, A)
  L(C) =(C,) + (A,) + (A) -> (C, A)
  继续带.
  L(E) = (E,) + (C, A) + (A) + (C,A) -> E, C, A
  L(D) = (D,) + (B, A) + (C, A) + (B, C) -> D, B, C, A

  继续带.
  L(G) = (G,) + (E, C, A) + (E) -> G, E, C, A
  L(F) = (F,) + (D, B, C, A) + (E, C, A) + (D, E)-> F, D, B, E, C, A
  加油, 最后了
  L(H) = (H, ) + (G, E, C, A) + ( F, D, B, E, C, A) + (G, F) -> H, G, F, D, B, E, C, A

算完了. 最终结果 HGFDBECA. 那这个算完了. 如何验证呢? 其实python早就给你准备好了. 我们可以使⽤类名.__mro__获取到类的MRO信息.
print(H.__mro__)
结果:
(<class '__main__.H'>, <class '__main__.G'>, <class '__main__.F'>, <class
'__main__.D'>, <class '__main__.B'>, <class '__main__.E'>, <class
'__main__.C'>,<class '__main__