zoukankan      html  css  js  c++  java
  • python--MRO和C3算法

    一 . 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__
  • 相关阅读:
    C# 关键字 virtual、override和new的用法
    架构技术及架构要素总结【转】
    vue文件目录结构
    vue项目中,如何对static文件夹下的静态文件添加时间戳,以达到清除缓存
    webpack中关于require与import的区别
    vue 根据下拉框动态切换form的rule
    el-select 根据value查询其对应的label值
    web前端项目规范
    JavaScript 编码规范
    HTML 编码规范
  • 原文地址:https://www.cnblogs.com/uiys/p/10673186.html
Copyright © 2011-2022 走看看