__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. 初识mysql索引 - 小白篇

    :接触mysq也有两年左右的时间了,但是对该数据库的理解自认还比较初级,看过很多文章,也看过一些相关的书籍,依然小白....(这里个人总结是两点主要原因:1.对mysql的学习大部分都是源于看一些杂七 ...

  2. 在虚拟机上的关于NFS网络文件系统

    小知识: NFS(Network Files System)即网络文件系统,NFS文件系统协议允许网络中的主机通过TCP/IP协议进行资源共享,NFS客户端可以像使用本地资源一样读写远端NFS服务端的 ...

  3. C/C.cpp

    我是怎么说服自己这题没有答案单调性的? 当轮数大于最优答案时,B的操作就成了捣乱,会使A多进行若干操作才能回复原状态 嗯,所以答案没有单调性. 就没去想A的操作可以把B的抵消啊.. 另外swap没有交 ...

  4. 面试精选:JVM垃圾回收

    Tips:关注公众号:松花皮蛋的黑板报,领取程序员月薪25K+秘籍,进军BAT必备! Java堆中存放着大量的Java对象实例,在垃圾收集器回收内存前,第一件事情就是确定哪些对象是“活着的”,哪些是可 ...

  5. 【WPF on .NET Core 3.0】 Stylet演示项目 - 简易图书管理系统(3) - 使用Conductor切换页面

    前两章中, 我们已经实现了这个图书管理系统的登录窗口, 并实施了完善的单元测试. 该是时候回过头来关注我们的主窗口了. 一个功能丰富的系统一般会有多个页面, 我们图书管理系统虽然是"简易&q ...

  6. 关于mysql驱动cj与不是cj的问题

    1. 带cj的是mysql驱动6.0以上的,不带的是6.0以下的. 2.6.0以上的需要注意有时区纠正

  7. Kafka needs no Keeper(关于KIP-500的讨论)

    写在前面的 最近看了Kafka Summit上的这个分享,觉得名字很霸气,标题直接沿用了.这个分享源于社区的KIP-500,大体的意思今后Apache Kafka不再需要ZooKeeper.整个分享大 ...

  8. hdu 1878 欧拉回路(联通<并查集> + 偶数点)

    欧拉回路Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  9. Kali Rolling 系统配置总结 (Updateing)

    主系统Kali Linux确实好用,继<Kali~2018安装后的配置>之后,自己又全面详细的总结了关于Kali Linux系统安装后的配置,<Kali Rolling 系统配置总结 ...

  10. 前端 vue单页面应用刷新网页后vuex的state数据丢失的解决方案(转载)

    最近接手了一个项目,前端后端都要做,之前一直在做服务端的语言.框架和环境,前端啥都不会啊. 突然需要前端编程,两天速成了JS和VUE框架,可惜还是个半吊子.然后遇到了一个困扰了一整天的问题.一直调试都 ...