两个公式
L(object) = [object]
L(子类(父类1, 父类2)) = [子类] + merge(L(父类1), L(父类2) , [父类1, 父类2])
注意
+ 代表合并列表
merge算法
1. 第一个列表的第一个元素
是后续列表的第一个元素
或者
后续列表中没有再次出现
则将这个元素合并到最终的解析列表中
并从当前操作的所有列表中删除
2. 如果不符合,则跳过此元素,查找下一个列表的第一个元素,重复1的判断规则
3. 如果最终无法把所有元素归并到解析列表, 则报错
# 菱形继承
class D(object):
pass
# L(D(objecj)) = [D] + mearge(L(object), [object])
# = [D] + mearge([object], [object])
# = [D] + mearge([], [])
# = [D, object] class B(D):
pass
# L(B(D)) = [B] + mearge(L(D), [D])
# = [B] + mearge([D, object], [D])
# = [B, D] + mearge([object], [])
# = [B, D, object] + mearge([], [])
# = [B, D, object] class C(D):
pass
# L(C(D)) = [C] + mearge(L(D), [D])
# = [C] + mearge([D, object], [D])
# = [C, D] + mearge([object], [])
# = [C, D, object] + mearge([], [])
# = [C, D, object] class A(B, C):
pass
# L(A) = [A] + mearge(L(B), L(C), [B, C])
# = [A] + mearge([B, D, object],[C, D, object], [B, C])
# = [A, B] + mearge([D, object],[C, D, object], [C])
# = [A, B, C] + mearge([D, object],[D, object])
# = [A, B, C, D] + mearge([object],[object])
# = [A, B, C, D, object] + mearge([],[])
# = [A, B, C, D, object] print(A.mro())
print(A.__mro__)
import inspect
print(inspect.getmro(A))
表头 表尾
表头 列表的第一个元素
表尾 列表中表头以外的元素集合(可以为空)
[A,B,D,C] A表头 BDC 表尾
merge( [E,O], [C,E,F,O], [C] )
取出第一个列表的表头 E 所有列表的表尾 O E F O ''
如果E 在所有的表尾中,那么就跳过这个列表
merge( [E,O], [C,E,F,O], [C] )
第二个列表表头: C O EFO '' 将C 单独提出
[c] + merge([E,O], [E,F,O])
mro(C) = mro(C(B,A)) = [C] + merge(mro(B),mro(A),[B,A])
mro(A) = mro(A(B,C))
# 新式类:
# class A:
# pass
#
# class B:
# pass
#
# class C(B,A):
# pass
# #mro(Child(Base1,Base2)) = [ Child ] + merge( mro(Base1), mro(Base2), [ Base1, Base2] )
# # mro(C) = mro(C(B,A)) = [C] + merge(mro(B),mro(A),[B,A])
#

class O:
def func(self):
print('in O')
class D(O):
pass
# def func(self):
# print('in D') class E(O):
pass
# def func(self):
# print('in E') class F(O):
def func(self):
print('in F') class B(D, E):
pass
# def func(self):
# print('in B')
# mro(B) = mro(B(D,E))
# mro(B(D,E)) = [B] + merge(mro(D),mro(E),[D,E])
# mro(B(D,E)) = [B] + merge([D,O],[E,O],[D,E])
# mro(B(D,E)) = [B,D] + merge([O],[E,O],[E])
# mro(B(D,E)) = [B,D,E] + merge([O],[O])
# mro(B(D,E)) = [B,D,E,O] class C(E, F):
pass
# def func(self):
# print('in C')
# mro(C) = mro(C(E,F))
# mro(C(E,F)) = [C] + merge([E,O],[F,O],[E,F])
# mro(C(E,F)) = [C,E] + merge([O],[F,O],[F])
# mro(C(E,F)) = [C,E,F] + merge([O],[O])
# mro(C(E,F)) = [C,E,F,O] class A(B, C):
def func(self):
super().func()
print('in A')
# mro(A(B,C)) = [A] + merge(mro(B),mro(C),[B,C])
# mro(A(B,C)) = [A] + merge([B,D,E,O],[C,E,F,O],[B,C])
# mro(A(B,C)) = [A,B] + merge([D,E,O],[C,E,F,O],[C])
# mro(A(B,C)) = [A,B,D] + merge([E,O],[C,E,F,O],[C])
# mro(A(B,C)) = [A,B,D,C] + merge([E,O],[E,F,O])
# mro(A(B,C)) = [A,B,D,C,E] + merge([O],[F,O])
# mro(A(B,C)) = [A,B,D,C,E,F] + merge([O],[O])
# mro(A(B,C)) = [A,B,D,C,E,F,O] obj = A()
obj.func()
# mro(A(B,C)) = [A,B,D,C,E,F,O]
print(A.__mro__)
# super 遵循mro 顺序

练习

class A:
pass class B(A):
pass class C(A):
pass class D(A):
pass class E(B,C):
pass class F(C,D):
pass class G(D):
pass class H(E,F):
pass class I(F,G):
pass class K(H,I):
pass # print(K.mro())
# print(E.mro())
# print(F.mro())
# print(G.mro())
# print(I.mro())
# print(H.mro()) '''
mro(K(H, I)) = [K] + merge(mro(H), mro(I), [H, I])
mro(K(H, I)) = [K] + merge(mro[H, E, B, F, C, D, A], [I, F, C, G, D, A], [H, I])
mro(K(H, I)) = [K, H] + merge(mro[E, B, F, C, D, A], [I, F, C, G, D, A], [I])
mro(K(H, I)) = [K, H, E, B, I] + merge(mro[F, C, D, A], [F, C, G, D, A])
mro(K(H, I)) = [K, H, E, B, I, F, ] + merge(mro[C, D, A], [C, G, D, A])
mro(K(H, I)) = [K, H, E, B, I, F, C, ] + merge(mro[D, A], [G, D, A])
mro(K(H, I)) = [K, H, E, B, I, F, C, G] + merge(mro[D, A], [D, A])
mro(K(H, I)) = [K, H, E, B, I, F, C, G, D, A] mro(H)
mro(H(E, F)) = [H] + merge(mro(E), mro(F), [E, F])
mro(H(E, F)) = [H] + merge([E, B, C, A], [F, C, D, A], [E, F])
mro(H(E, F)) = [H, E] + merge([B, C, A], [F, C, D, A], [F])
mro(H(E, F)) = [H, E, B] + merge([C, A], [F, C, D, A], [F])
mro(H(E, F)) = [H, E, B, F] + merge([C, A], [C, D, A])
mro(H(E, F)) = [H, E, B, F, C] + merge([A], [D, A])
mro(H(E, F)) = [H, E, B, F, C, D, A] mro(I)
mro(I(F, G)) = [I] + merge(mro(F), mro(G), [F, G])
mro(I(F, G)) = [I] + merge([F, C, D, A], [G, D, A], [F, G])
mro(I(F, G)) = [I, F] + merge([C, D, A], [G, D, A], [G])
mro(I(F, G)) = [I, F, C] + merge([D, A], [G, D, A], [G])
mro(I(F, G)) = [I, F, C] + merge([D, A], [D, A])
mro(I(F, G)) = [I, F, C, G, D] + merge([A], [A])
mro(I(F, G)) = [I, F, C, G, D, A] mro(E)
mro(E(B, C)) = [E] + merge(mro(B), mro(C), [B, C])
mro(E(B, C)) = [E] + merge([B, A], [C, A], [B, C])
mro(E(B, C)) = [E, B] + merge([A], [C, A], [C])
mro(E(B, C)) = [E, B, C] + merge([A], [A])
mro(E(B, C)) = [E, B, C, A] mro(F)
mro(F(C, D)) = [F] + merge(mro(C), mro(D), [C, D])
mro(F(C, D)) = [F] + merge([C, A], [D, A], [C, D])
mro(F(C, D)) = [F, C] + merge([A], [D, A], [D])
mro(F(C, D)) = [F, C, D] + merge([A], [A])
mro(F(C, D)) = [F, C, D, A] mro(G)
mro(G(D)) = [G, D, A]
'''

python3中的新式类mro查看和C3算法原理的更多相关文章

  1. python中的新式类与旧式类

    在python2中,有新式类与旧式类的区别: 首先创建一个类: class Sb(object): pass 如果创建时继承自object,说明这是一个新式类,不写object,说明是一个旧式类: 那 ...

  2. 类的继承和C3算法

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

  3. 洗礼灵魂,修炼python(43)--巩固篇—经典类/新式类

    经典类 1.什么是经典类 就是在使用class关键词时,括号内不添加object类的就叫经典类,前面的博文里是绝对解析过的,所以你应该知道,经典类现在已经仅存在于python2了,因为python3不 ...

  4. PYTHON3中 类的继承

    继承 1:什么是继承 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,也就是说在python中支持一个儿子继承多个爹. 新建的类成为子类或者派生类. 父类又可以成为基类或者 ...

  5. python 零散记录(七)(下) 新式类 旧式类 多继承 mro 类属性 对象属性

    python新式类 旧式类: python2.2之前的类称为旧式类,之后的为新式类.在各自版本中默认声明的类就是各自的新式类或旧式类,但在2.2中声明新式类要手动标明: 这是旧式类为了声明为新式类的方 ...

  6. python单例模式控制成只初始化一次,常规型的python单例模式在新式类和经典类中的区别。

    单例模式的写法非常多,但常规型的单例模式就是这样写的,各种代码可能略有差异,但核心就是要搞清楚类属性 实例属性,就很容易写出来,原理完全一模一样. 如下: 源码: class A(object): d ...

  7. python2和python3中的类

    经典类与新式类 例如: A B C D 四个类 D 包含 BC :   B和C分别包含A py2 在经典类中是按深度优先来继承 例如: D中查找B,B没有从A中查找 新式类中是按广度优先来查找继承的 ...

  8. Python中新式类和经典类的区别,钻石继承

    1)首先,写法不一样: class A: pass class B(object): 2)在多继承中,新式类采用广度优先搜索,而旧式类是采用深度优先搜索. 3)新式类更符合OOP编程思想,统一了pyt ...

  9. Python新式类与经典类的区别

    1.新式类与经典类 在Python 2及以前的版本中,由任意内置类型派生出的类(只要一个内置类型位于类树的某个位置),都属于“新式类”,都会获得所有“新式类”的特性:反之,即不由任意内置类型派生出的类 ...

随机推荐

  1. 详述MySQL服务在渗透测试中的利用

    本文作者:i春秋签约作家——Binghe 致力于书写ichunqiu社区历史上最长篇最细致最真实的技术复现文章. 文章目录: MySQL之UDF提权 MySQL之MOF提权 MySQL之常规写启动项提 ...

  2. 系统可能不会保存你所做的修改 onbeforeunload

    网上找了好多实现这个的方法,说的还是不明白.害得我(我自己的原因)以为是需要在服务器环境下才能跑通 window.onbeforeunload; 后来猜想是不是函数返回值发生变化就会触发. <! ...

  3. mysql主从同步详细教程

    1.安装好主数据库和从数据库,这个大家肯定都会,如果不是很明白,可以参考我前面的安装教程. 例子: 假如我需要同步test1.test2数据库 系统:centos7 主库主机:192.168.1.25 ...

  4. yolov3源码分析keras(一)数据的处理

    一.前言 本次分析的源码为大佬复现的keras版本,上一波地址:https://github.com/qqwweee/keras-yolo3 初步打算重点分析两部分,第一部分为数据,即分析图像如何做等 ...

  5. PL/SQL DEVELOPER数字超长显示了科学计数法

    问题: 最近在做项目中,ID使用了长整形,10进制数值大约长度17位,在pl/sql developer 上数值由科学计数法显示. 在查看时不是很方便,且数值进行了省略显示,不准确. 解决方法: 在t ...

  6. springboot-6-整合jdbc

    如果有整合jpa了, 那么在dao中直接, 不需要引入依赖 @Resource private JdbcTempalte jdbcTempalte; 如果没有的话, 就先在pom.xml中加入依赖 & ...

  7. FindBugs:Java 静态代码检查

    在使用 Jenkins 构建 Java Web 项目时候,有一项叫做静态代码检查,是用内置的 findBugs 插件,对程序源代码进行检查,以分析程序行为的技术,应用于程序的正确性检查. 安全缺陷检测 ...

  8. MOss213获得用户登录名

    因SharePoint2013默认使用claims based authentication,所以其帐号会是i:0#.w|/domain name这样的格式,如何去掉前面的内容,只保留登录帐号呢? 参 ...

  9. vue router的浏览器跳转行为

    最近做的项目中,涉及vue router 路由操作,其操作方法不同,产生的行为亦不同.本文通过对比实验,对其行为进行实验对比及总结,避免混淆. vue router的单页跳转的history模式,类似 ...

  10. js / jquery 获取和设置 FCK Editor 的值

    开发中遇到 通过 $("#content").val(); 或者 document.getElementById("content"); 并不能获取到 id 为 ...