C3算法说到底就是merge算法,看了一些帖子,总结说得莫名其妙,大家也是抄来抄去,我试着用自己的话来把这个东西怎么操作的说清楚。当然了我也要抄一些别人的,但是我会 尽量把我认为别人没有讲清楚的那一部分东西说清楚。还是得从一个例子说起,毕竟一来就说一大段理论我认为是在耍流氓。

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)
继续从代码中找G和F的⽗父类往里面带
L(G) = G + L(E)
L(F) = F + L(D)+ L(E)
继续找E 和 D
L(E) = E + L(C) + L(A)
L(D) = D + L(B) + L(C)
继续找B和C
L(B) = B + L(A)
L(C) = C + L(A)
最后就剩下一个A了. 也就不用再找了.
接下来. 把L(A) 往里带. 再推回去. 但要记住. 这里的 + 表示的是merge.

merge的原则是⽤每个元组的头⼀项和后⾯元组的除头⼀项外的其他元素进⾏比较, 看是否存在。如果存在,就从下⼀个元组的头⼀项继续找,如果找不到,就拿出来。作为merge的结果的⼀项,以此类推,直到元组之间的元素都相同,也就不⽤再找了。

L(B) =(B,) + (A,) -> (B, A)

L(C) =(C,) + (A,) -> (C, A)
继续带.
L(E) = (E,) + (C, A) + (A) -> E, C, A
L(D) = (D,) + (B, A) + (C, A) -> D, B,C, A

下面我们来看个例子:

拿上面这个L(D)举个例子,D不在后面出现,拿出来,B也不在后面,也拿出来。在B拿出来之后,merge里面里面的情况:D,B

此时L(D)=(A,)+(C,A)。OK,我们现在继续进行merge,现在tuple里面的头元素A出现在后面tuple的非头元素位置,因此要跳过A,然后,后面的(C,A)都满足条件

因此上面merge的结果是:D,B,C,A
继续带.
L(G) = (G,) + (E, C, A) -> G, E, C, A
L(F) = (F,) + (D, B, A) + (E, C, A) -> F, D, B, E, C, A
加油, 最后了
L(H) = (H, ) + (G, E, C, A) + ( F, D, B, E, C, A) -> H, G, F, D, B, E, C, A

"""
[<class '__main__.H'>,<class '__main__.G'>,
<class '__main__.F'>, <class '__main__.D'>,
<class '__main__.B'>, <class '__main__.E'>,
<class '__main__.C'>, <class '__main__.A'>,
<class 'object'>] """

C3算法之我见的更多相关文章

  1. Python之MRO及其C3算法

    [<class '__main__.B'>, <class '__main__.A'>, <class 'object'>] (<class '__main_ ...

  2. Python新式类继承的C3算法

    在Python的新式类中,方法解析顺序并非是广度优先的算法,而是采用C3算法,只是在某些情况下,C3算法的结果恰巧符合广度优先算法的结果. 可以通过代码来验证下: class NewStyleClas ...

  3. python全栈开发day103-python垃圾回收机制、mro和c3算法解析、跨域jsonp\CORS、Content-Type组件

    Python垃圾回收 -- 引用计数 -- Python为每个对象维护一个引用计数 -- 当引用计数为0的 代表这个对象为垃圾 -- 标记清除 -- 解决孤立的循环引用 -- 标记根节点和可达对象 - ...

  4. 手推C3算法

    C3算法规则 -- 每一个类的继承顺序都是从基类向子类看 -- 形成一个指向关系的顺序[当前类] + [父类的继承顺序] -- 进行一个提取 -- 如果一个类出现从左到右的第一个顺序上,并且没有出现在 ...

  5. MRO C3算法 super的运用

    -------------态度决定成败,无论情况好坏,都要抱着积极的态度,莫让沮丧取代热心.生命可以价值极高,也可以一无是处,随你怎么去选择.# --------------------------- ...

  6. python之路--MRO和C3算法

    一 . MRO(method resolution order) 多继承的一种方法,一种查找的顺序 在python3 里面是一种新类式MRO 需要用都的是C3算法 class A: pass clas ...

  7. python 面向对象(六)MRO C3算法 super

    ########################总结################ 面向对象回顾 类:对某一个事物的描述,对一些属性和方法的归类 class 类名: var=123#类变量 def ...

  8. Python多重继承顺序---C3算法

    什么是多重继承C3算法 MRO即 method resolution order (方法解释顺序),主要用于在多继承时判断属性的路径(来自于哪个类). 在python2.2版本中,算法基本思想是根据每 ...

  9. python摸爬滚打之day20--多继承,MRO和C3算法

    1.新式类和经典类 在python2.2之前, 基类如果不写(), 则表示为经典类; 在python2.2之后, 经典类不复存在, 只存在新式类. 如果基类谁都不继承的话, 则默认继承object. ...

随机推荐

  1. Ubuntu16.04下同时安装Anaconda2与Anaconda3

    转自:http://blog.csdn.net/juezhanangle/article/details/78922888 由于编程时同时需要有python2/3的环境和大量的依赖包,本文的思路是先根 ...

  2. eclipse中的TODO和FIXME

    最近使用eclipse开发代码时,公司要求按他们制定代码规范编写代码,其他都还好,因为基本都养成良好习惯了,但TODO和FIXME就有点陌生,查了一下资料,发现笔者寡闻了,果然学海无涯,好了,下边解释 ...

  3. xftp的简单使用

    1.下载并安装Xftp工具.打开Xftp工具,点击“新建”. 2.在“新建会话属性”中选择“名称”为主机命名,在“主机”栏输入主机IP,“协议”和“端口号”使用sftp和22,在“用户名”和“密码“栏 ...

  4. Java Swing 如何让窗体居中显示

    如题,其他不多说,直接上代码! package com.himarking.tool; import java.awt.Toolkit; import javax.swing.JFrame; @Sup ...

  5. Velocity加载模版文件

    一.类路径 加载classpath目录下的vm文件,或者maven项目的resources路径下 Properties p = new Properties(); p.put("file.r ...

  6. tomcat是一个应用服务器

    总的来说,tomcat的身份可以看作一个WEB容器,但实际上是一个应用程序服务器.为什么这么说?1.因为你从tomcat内部看你会发现其实tomcat内置了一个轻量级的WEB服务器,用于转发html文 ...

  7. Codeforces #528 Div2 F (1087F) Rock-Paper-Scissors Champion 树状数组+set

    题意:n个人站成一排,初始时刻每个人手中都有一个图案,可能是石头,剪刀,布3个中的1种,之后会随机选取相邻的两个人玩石头剪刀布的游戏,输的人会离开(如果两个人图案相同,则随机选择一个人离开).执行(n ...

  8. 磨刀——python及相关工具

    1.python语言包 1.1去https://www.python.org/,在download栏下载最新版python2或者python3 tips:1.点击下载会很慢,推荐:迅雷,百度云盘下载, ...

  9. C++用指针变量作为函数的参数接受数组的值的问题的总结

    实参和形参的四种结合方式 实参 形参 实例 数组名 数组名 1.1 数组名 指针变量 1.2 指针变量 数组名 1.3 指针变量 指针变量 1.4 本文以输入10个整数,然后对其进行排序,然后输出的程 ...

  10. 利用JavaScriptCore实现以下简单的功能(平方和)

    #import "RootViewController.h" #import <JavaScriptCore/JavaScriptCore.h> @interface ...