zoukankan      html  css  js  c++  java
  • 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()  意思:默认为当前类名的下一个.
     
     
     
     
  • 相关阅读:
    Asp.net routing vs Url rewriting
    How to combine WCF Route and MVC Route to work together.
    Servlets beat CGI
    What if you encounter a problem when consume your WCF service ? How to Diagnostic it ?
    uva 4965 Sum the Square
    zoj 3633 Alice's present
    4966 Normalized Form
    ZOJ 3015 Collision Ball Game
    二分图 最小路径覆盖
    uva 2696 Air Raid
  • 原文地址:https://www.cnblogs.com/kevin-red-heart/p/10169527.html
Copyright © 2011-2022 走看看