python 之C3算法

C3算法只要针对的Python2.3版本之后出现的新式类MRO(method resolution order) -------继承方法查询顺序;而经典类MRO则遵循的是深度优先遍历(树形结构)

  (1)如图所示,经典类MRO算法

    

            MRo结果为G-->(E-->A-->B)-->(H)-->(F-->C--->D)

              该结果是不带括号的,为了方便显示算法顺序,故意加的括号,::::从左至右,一条道走到黑.

     (2)新式类

      (1)查分:

        例如

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,

⾸首先. 我们要确定从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的结果的⼀一项. 以此类推. 直到元组之间的元素都相同. 也就不⽤用再找了了.

      (2)合并:

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
 
 
 
另外super()
    super(Base,self).func()   意思为:从Base类开始,下一个父类;
             super().func()  意思:默认为当前类名的下一个.
 
 
 
 

posted on 2018-12-24 16:55  赤子之心心有所属  阅读(275)  评论(0编辑  收藏  举报

导航