__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. 原生js实现上拉加载

    原生js实现上拉加载其实超级简单,把原理整明白了你也会,再也不用去引一个mescroll啦~ 好了,废话不多说,开始进入正题:上拉加载是怎么去做的,原理就是监听滚动条滑到页面底部,然后就去做一次请求数 ...

  2. 8、pytest -- 捕获告警信息

    目录 1. 告警信息的默认捕获行为 2. @pytest.mark.filterwarnings 3. 去使能告警信息的展示 4. 去使能告警的捕获行为 5. DeprecationWarning和P ...

  3. 学习笔记04IIS

    IIS机制:1.能监听端口,获取socket的客户端对象2.获取请求报文,将请求报文变成对象.3.处理请求报文,通过HttpApplication.ProcessRequest方法来处理HttpCon ...

  4. Pandas文本数据处理

    先初始化数据 import pandas as pd import numpy as np index = pd.Index(data=["Tom", "Bob" ...

  5. jmeter-利用While Controller控制器实现接口报错时的重试机制

    预期功能:在jmter脚本报错的时候重试,最多重试5次 1.添加While Controller 2.添加请求 3.添加断言,在断言不符合预期的时候加上代码:vars.put("status ...

  6. redhat 配置eth0网卡

                 redhat 找不到eth0等网卡设备 Serenity关注                                                         ...

  7. PHPExcel数据导入(含图片)

    PHPExcel是一个PHP类库,用来帮助我们简单.高效实现从Excel读取Excel的数据和导出数据到Excel. 首先下载压缩包: https://codeload.github.com/PHPO ...

  8. RabbitMQ 的高可用集群

    RabbitMQ 的高可用性 RabbitMQ 是比较有代表性的,因为是基于主从(非分布式)做高可用的 RabbitMQ 有三种模式:单机模式.普通集群模式.镜像集群模式. 单机模式 单机模式,生产几 ...

  9. ThinkPHP 6.0 管道模式与中间件的实现分析

    设计模式六大原则 开放封闭原则:一个软件实体如类.模块和函数应该对扩展开放,对修改关闭. 里氏替换原则:所有引用基类的地方必须能透明地使用其子类的对象. 依赖倒置原则:高层模块不应该依赖低层模块,二者 ...

  10. nyoj 115-城市平乱 (BFS)

    115-城市平乱 内存限制:64MB 时间限制:1000ms 特判: No 通过数:5 提交数:8 难度:4 题目描述: 南将军统领着N个部队,这N个部队分别驻扎在N个不同的城市. 他在用这N个部队维 ...