zoukankan      html  css  js  c++  java
  • mro和c3 算法

    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

    计算方法:先将每一个类的继承mro,先将每个类的mro表示出来

    比如我要找H这个类的mro是什么,我先找到每个类的mro后,再进行反向的计算

    每个类的mro

    例如
    '''
    L(H) = H + L(G) + L(F)
    # 这里可以看到,H是继承了G和F的,这里使用深度优先遍历,我先找完L(G) 这边的mro
    L(G) = G + L(E)
    L(E) = E + L(C) + L(A)
    L(C) = C + L(A)
    L(A)=A
    
    # 我再找L(F)这边,也是使用深度优先遍历
    L(F)=F + L(D)+ L(E)
    L(D) = D + L(B) + L(C)
    L(B) = B + L(A)
    
    # 这样我就计算出来每一个类的mro了,为了方便后续计算我将这两个部分按照顺序排序下便于计算
    '''
    # 排序后
    # 排序后
    L(H) = H + L(G) + L(F)
    L(G) = G + L(E)
    L(F)=F + L(D)+ L(E)
    L(E) = E + L(C) + L(A)
    L(D) = D + L(B) + L(C)
    L(C) = C + L(A)
    L(B) = B + L(A)
    L(A)=A
    
    # 因此计算的方法可以将L(A)=A 反向代入进行计算,
    # 把L(A) 往⾥带. 再推回去. 但要记住. 这⾥的
    # + 表⽰的是merge. merge的原则是⽤每个元组的头⼀项和后⾯元组的除头⼀项外的其他元
    # 素进⾏比较, 看是否存在. 如果存在. 就从下⼀个元组的头⼀项继续找. 如果找不到. 就拿出来.
    # 作为merge的结果的⼀项. 以此类推. 直到元组之间的元素都相同. 也就不⽤再找了.
    
    L(A)=A
    L(B) = B + L(A)     ---->   L(B)=B+A-->     L(B)=BA
    L(C) = C + L(A)     ---->   L(C)=C+A-->     L(C)=CA
    L(D) = D + L(B) + L(C)  ---->   L(D)=D+BA+CA --->  L(D)=DBCA
    L(E) = E + L(C) + L(A)    ---->L(E) = E+CA+A --->  L(E)=E, C, A
    L(F)=F + L(D)+ L(E)         ----->L(F)=F, D, B, E, C, A
    L(G) = G + L(E)           ---->  L(G)=G, E, C, A
    L(H) = H + L(G) + L(F)  ---->L(H) = (H, ) + (G, E, C, A) + ( F, D, B, E, C, A) -> H, G, F, D, B, E, C, A
  • 相关阅读:
    poj 2312 Battle City
    poj 2002 Squares
    poj 3641 Pseudoprime numbers
    poj 3580 SuperMemo
    poj 3281 Dining
    poj 3259 Wormholes
    poj 3080 Blue Jeans
    poj 3070 Fibonacci
    poj 2887 Big String
    poj 2631 Roads in the North
  • 原文地址:https://www.cnblogs.com/one-tom/p/13383038.html
Copyright © 2011-2022 走看看