• 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
  • 相关阅读:
    mongoDB 获取系统时间
    android应用程序监听SMS Intent广播
    安卓开发之探秘蓝牙隐藏API
    Android内存优化解决 资料和总结的经验分享
    android 访问SMS短信收件箱
    Android 和 PHP 之间进行数据加密传输
    Android开发 MMS支持 创建和编辑MMS
    android 动态改变屏幕方向
    Android 使用 Gmail 来发送邮件
    android数据库操作之直接读取db文件
  • 原文地址:https://www.cnblogs.com/one-tom/p/13383038.html
Copyright © 2020-2023  润新知