__mro__

1.只有在python2中才分新式类和经典类,python3中统一都是新式类
2.在python2中,没有显式的继承object类的类,以及该类的子类,都是经典类
3.在python2中,显式地声明继承object的类,以及该类的子类,都是新式类
3.在python3中,无论是否继承object,都默认继承object,即python3中所有类均为新式类

__mro__三次进化

经典类(classic class)的深度遍历。

Python 2.2 的新式类(new-style class)预计算。

Python 2.3 的新式类的C3 算法。它也是 Python 3 唯一支持的方式。

简单说下实现:

前面两种都是基于深度遍历的,但是第一种重复保留的是第一个,第二种,重复保留的是最后一个

第三种就是基于c3算法的

为啥要用c3算法?是为了解决原来基于深度优先搜索算法不满足本地优先级,和单调性的问题。

菱形



zx

(<class 'main.zx'>, <class 'main.c'>, <class 'main.b'>, <class 'main.e'>, <class 'main.d'>, <class 'main.g'>, <class 'main.f'>, <class 'main.a'>, <class 'object'>)

class a:
def f1(self):
print("a") class b(a):
def f1(self):
print("b") class c(b):
def f1(self):
print("c") class d(a):
def f1(self):
print("d") class e(d):
def f1(self):
print("e") class f(a):
def f1(self):
print("f") class g(f):
def f1(self):
print("g") class zx(c,e,g):
def f1(self):
print("zx") wl=zx()
wl.f1()
print(zx.__mro__)



zx

(<class 'main.zx'>, <class 'main.c'>, <class 'main.b'>, <class 'main.a'>, <class 'main.e'>, <class 'main.f'>, <class 'main.d'>, <class 'object'>)

class a:
def f1(self):
print("a") class b(a):
def f1(self):
print("b") class c(b):
def f1(self):
print("c") class d:
def f1(self):
print("d") class e(d):
def f1(self):
print("e") class f(d):
def f1(self):
print("f") class zx(c,e,f):
def f1(self):
print("zx") wl=zx()
wl.f1()
print(zx.__mro__)

(<class 'main.zx'>, <class 'main.b'>, <class 'main.c'>, <class 'main.a'>, <class 'main.h'>, <class 'main.f'>, <class 'main.i'>, <class 'main.g'>, <class 'main.e'>, <class 'main.d'>, <class 'object'>)

class a:
def f1(self):
print("a") class b(a):
def f1(self):
print("b") class c(a):
def f1(self):
print("c") class d:
def f1(self):
print("d") class e(d):
def f1(self):
print("e") class f(d):
def f1(self):
print("f") class g(e):
def f1(self):
print("g") class h(f):
def f1(self):
print("h") class i(g):
def f1(self):
print("i") class zx(b,c,h,i):
def f1(self):
print("zx") wl=zx()
wl.f1()
print(zx.__mro__)

简单的线性继承还是有规律可循的,总结来说就是解菱形,如果分支不含菱形就直接找到-1层,等待其他分支来找obj,因为最终各条线路的终点肯定是obj

python 3 mro的更多相关文章

  1. 【转】你真的理解Python中MRO算法吗?

    你真的理解Python中MRO算法吗? MRO(Method Resolution Order):方法解析顺序. Python语言包含了很多优秀的特性,其中多重继承就是其中之一,但是多重继承会引发很多 ...

  2. Python之MRO及其C3算法

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

  3. 用python实现MRO算法

    引子: 如图反映了python3中,几个类的继承关系和查找顺序.对于类A,其查找顺序为:A,B,E,C,F,D,G,(Object),这并不是一个简单的深度优先或广度优先的规律.那么这个顺序到底是如何 ...

  4. python之MRO和垃圾回收机制

    一.MOR 1.C3算法简介 为了解决原来基于深度优先搜索算法不满足本地优先级,和单调性的问题. python2.3版本之后不管是新式类还是经典类,查找继承顺序都采用C3算法 2.算法原理 C3算法的 ...

  5. 你真的理解Python中MRO算法吗?[转]

    [前言] MRO(Method Resolution Order):方法解析顺序.Python语言包含了很多优秀的特性,其中多重继承就是其中之一,但是多重继承会引发很多问题,比如二义性,Python中 ...

  6. python之MRO和C3算法

    python2类和python3类的区别pyhon2中才分新式类与经典类,python3中统一都是新式类Python 2.x中默认都是经典类,只有显式继承了object才是新式类python 3.x中 ...

  7. Python中MRO

    MRO(方法解析顺序) 当有多重继承时,基于“从左到右,深度优先原则”: class CommonBase(): def Method(self): print('CommonBase') class ...

  8. [TimLinux] Python C3 MRO

    MRO:Method Resolution Order,即方法解析顺序,是python中用于处理二义性问题的算法 采用过的算法: 1. DFS(深度优先算法) 2. BFS(广度优先算法) 3. C3 ...

  9. python --- 21 MRO C3算法

    一.python2.2之前用的是   经典类的MRO继承 ①深度递归继承     从左到右 ,一条路走到黑 ②广度继承           一层一层的继承 深度继承时   为   R 1 2 3 4 ...

随机推荐

  1. CSPS模拟 43

    我这次把考试题改完了 T1 A 发现S*b必须和T模a同余? 貌似乘不了几次就爆T了?可以暴力? 也许乘的越多越好? 内心:切了 另外怎么设置鼠标指到黑块上边就显示字那种东西 最后当然是因为低错没有A ...

  2. 机器学习之scikit-learn库

    前面讲到了,这个库适合学习,轻量级,所以先学它. 安装就不讲了,简单.不过得先安装numpy和pandas库才能安装scikit-learn库. 如果安装了anaconda得话,会自带有这个库. -- ...

  3. 利用DI实现级联删除 - xms跨平台基础框架 - 基于.netcore

    一.引言 所谓级联删除是指删除一条记录后,附带关联记录也一起删除,比如删除客户后,联系人也一起删除: 以往我们会依赖于数据库表的外键约束,但存在着明显的问题,增加数据库压力.提示不友好.职责越界.事务 ...

  4. python手册学习笔记1

    笔记1 > http://www.pythondoc.com/pythontutorial3/controlflow.html 参数传递 Python中sys.argv的用法 调用解释器时,脚本 ...

  5. python内置模块collections介绍

    目录 python内置模块collections介绍 1.namedtuple 2.deque 3.defaultdict 4.OrderedDict 5.ChainMap 6.Counter 7.小 ...

  6. 格式工厂转化成mp4 avc格式 暴风影音不能播放的解决方法

    格式工厂转化成mp4 avc格式 暴风影音不能播放的解决方法  先转成其他mp4 确保能播放 然后再转成avc

  7. Ember.js和Vue.js对比,哪个框架更优秀?

    本文由葡萄城技术团队于博客园翻译并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. JavaScript最初是为Web应用程序创建的.但是随着前端技术的 ...

  8. c#属性(Property)

    属性(Property)是类(class).结构(structure)和接口(interface)的命名(named)成员.类或结构中的成员变量或方法称为 域(Field).属性(Property)是 ...

  9. hdu 1251 统计难题 (字典树(Trie)<PS:C++提交不得爆内存>)

    统计难题Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)Total Submis ...

  10. mysql基础之约束

    约束的目的: 1.约束保证数据的完整性和一致性. 2.约束分为表级约束 和 列级 约束.(针对约束字段的数目的多少来确定的) 3.约束类型包括 not null (非空约束) primary key( ...