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()  意思:默认为当前类名的下一个.
 
 
 
 

最新文章

  1. Linux资源管理-IO优先级
  2. U家面试prepare: Serialize and Deserialize Tree With Uncertain Children Nodes
  3. IOS9 Swift
  4. dictionaryWithContentsOfFile:方法
  5. thymelef 布局 fragment
  6. 【转】Android Studio中Git的配置及协同开发
  7. day05
  8. 打印Ibatis最后,SQL声明
  9. workerman启动失败解决
  10. 【leetocde】 105. Construct Binary Tree from Preorder and Inorder Traversal
  11. 【NOIP2016提高组】 Day2 T2 蚯蚓
  12. SpriteBuilder中如何固定两个互不接触的物理物体?
  13. 复杂度定义 The Definition of Complexity
  14. AI之旅(6):神经网络之前向传播
  15. Servlet简单概念和开发小总结
  16. numpy delete
  17. Android 解决在初次打开Activity加载布局文件时,ScrollView滚动条不在顶部的问题
  18. ionic2中如何使用自动生成器
  19. vsCode配置C++调试环境
  20. 09:vuex组件间通信

热门文章

  1. switch留个爪,之后还需要再研究下
  2. 学习笔记TF039:TensorBoard
  3. Object.is()
  4. Nginx网站实现ssl安全套接字
  5. 乐乐课堂_leleketang.com
  6. Nodepad++ 进行数据分析操作
  7. 分享一个生成反遗忘复习计划的java程序
  8. 【maven】之nexus常用的一些配置
  9. 知识点:spring 完全手册
  10. 将打印(printk/printf)及时写入文件的方法