python 3 mro
__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的更多相关文章
- 【转】你真的理解Python中MRO算法吗?
你真的理解Python中MRO算法吗? MRO(Method Resolution Order):方法解析顺序. Python语言包含了很多优秀的特性,其中多重继承就是其中之一,但是多重继承会引发很多 ...
- Python之MRO及其C3算法
[<class '__main__.B'>, <class '__main__.A'>, <class 'object'>] (<class '__main_ ...
- 用python实现MRO算法
引子: 如图反映了python3中,几个类的继承关系和查找顺序.对于类A,其查找顺序为:A,B,E,C,F,D,G,(Object),这并不是一个简单的深度优先或广度优先的规律.那么这个顺序到底是如何 ...
- python之MRO和垃圾回收机制
一.MOR 1.C3算法简介 为了解决原来基于深度优先搜索算法不满足本地优先级,和单调性的问题. python2.3版本之后不管是新式类还是经典类,查找继承顺序都采用C3算法 2.算法原理 C3算法的 ...
- 你真的理解Python中MRO算法吗?[转]
[前言] MRO(Method Resolution Order):方法解析顺序.Python语言包含了很多优秀的特性,其中多重继承就是其中之一,但是多重继承会引发很多问题,比如二义性,Python中 ...
- python之MRO和C3算法
python2类和python3类的区别pyhon2中才分新式类与经典类,python3中统一都是新式类Python 2.x中默认都是经典类,只有显式继承了object才是新式类python 3.x中 ...
- Python中MRO
MRO(方法解析顺序) 当有多重继承时,基于“从左到右,深度优先原则”: class CommonBase(): def Method(self): print('CommonBase') class ...
- [TimLinux] Python C3 MRO
MRO:Method Resolution Order,即方法解析顺序,是python中用于处理二义性问题的算法 采用过的算法: 1. DFS(深度优先算法) 2. BFS(广度优先算法) 3. C3 ...
- python --- 21 MRO C3算法
一.python2.2之前用的是 经典类的MRO继承 ①深度递归继承 从左到右 ,一条路走到黑 ②广度继承 一层一层的继承 深度继承时 为 R 1 2 3 4 ...
随机推荐
- 使用uni-app开发微信小程序
uni-app 开发微信小程序 前言 9月份,开始开发微信小程序,也曾调研过wepy/mpvue,考虑到后期跨端的需求,最终选择使用了uni-app,本文主要介绍如何使用uni-app搭建小程序项目, ...
- 学习笔记14Js使用技巧
**页面加载完毕时执行一段代码$(fuction(){ initialMethod(); }); *将一个<form>序列化为json对象并传给服务器var postData = $(&q ...
- [考试反思]0917csp-s模拟测试45:天命
又倒一了. 关于心态,有不少想说的. 首先旁边坐了一个kx.他上来入手T1没多久就切了然后开始对拍拍了几十万组AC. 然而我觉得T1是神仙题.先进T2. 挺简单的,5分钟出正解,然后在打出来的时候突然 ...
- [考试反思]0904NOIP模拟测试37:守望
100分并列的还有4个没粘 总分是大脸的一半,然而还只低了2名.差距好大...但其实后面的分数段又很密集,和我都差不了多少... 我可能也是最水的那一个,排行榜前7个里面就我没有AC.全是暴力... ...
- CSPS模拟 76
前序遍历,中序遍历,后序遍历 说的都是根节点在前,根节点在中,根节点在后. 长记性!
- 在ubuntu中安装minicom时出现device /dev/tty8 is locked解决办法
未正常关闭minicom yesaidu@ywf-ubuntu: ~$ ls /var/lock LCK..ttyS0 subsys yesaidu@ywf-ubuntu: ~$ kill 0 ye ...
- getchar()用法 【转】
1.从缓冲区读走一个字符,相当于清除缓冲区 2.前面的scanf()在读取输入时会在缓冲区中留下一个字符'\n'(输入完s[i]的值后按回车键所致),所以如果不在此加一个getchar()把这个回车符 ...
- springboot返回统一接口与统一异常处理
springboot返回统一接口与统一异常处理 编写人员:yls 编写时间:2019-9-19 0001-springboot返回统一接口与统一异常处理 简介 创建统一的返回格式 Result 封装统 ...
- C++中对C的扩展学习新增语法——动态内存管理
1.C语言动态内存管理的缺点: 1.malloc对象的大小需要自己计算. 2.需要手动转换指针类型. 3.C++的对象不适合使用malloc和free. 2.C++中new/delete基本使用: 3 ...
- SpringBoot 源码解析 (六)----- Spring Boot的核心能力 - 内置Servlet容器源码分析(Tomcat)
Spring Boot默认使用Tomcat作为嵌入式的Servlet容器,只要引入了spring-boot-start-web依赖,则默认是用Tomcat作为Servlet容器: <depend ...