C3算法之我见
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'>] """
最新文章
- Spring 学习笔记 4. 尚硅谷_佟刚_Spring_属性配置细节
- [New Portal]Windows Azure Virtual Machine (19) 关闭Azure Virtual Machine与VIP Address,Internal IP Address的关系(1)
- Query DSL for elasticsearch Query
- EF6 在原有数据库中使用 CodeFirst 总复习(二、新的需求,简单修改原有表)
- C# 、winform 添加皮肤后(IrisSkin2) label设置的颜色 无法显示
- oracle后台进程2
- Unity3d场景漫游---iTween实现
- github上fork了别人的项目后,再同步更新别人的提交
- SpringBoot整合Jsp和Thymeleaf (附工程)
- gentoo hibernate
- 【清北学堂2018-刷题冲刺】Contest 5
- 蓝桥杯——代表团出访——C++
- EPOLL AND Nonblocking I/O
- 牛刀小试MySQL--innodb_flush_log_at_trx_commit小结
- CentOs7 使用iptables防火墙开启关闭端口
- Centos7与Windows10添加Windows10启动项并设置为默认启动
- 6.1 C++ string类型变量的定义以及输入与输出
- JSON 语法
- odoo开发笔记 -- 数据库备份策略
- java字符数组char[]和字符串String之间的转换
热门文章
- nested exception is java.net.UnknownHostException: mybatis.org异常处理
- C语言学习笔记--#和##操作符
- DAY11-MYSQL补充之SQL逻辑查询语句执行顺序
- tomcat使用manager管理app时需要身份验证问题
- 一个servlet处理多个请求(使用Method的反射机制)
- python爬虫实战(1)--爬取糗事百科
- python爬虫--编码问题y
- REST API (更新文档)
- Codeforces 914C Travelling Salesman and Special Numbers (数位DP)
- ZROI2018提高day6t1