python MRO:C3算法
http://www.codeweblog.com/python-mro-c3%E7%AE%97%E6%B3%95/
在 python 2.2 之后,python 实现了一个新的MRO算法:C3算法,用于方法解析顺序 。
一、什么是方法解析顺序
方法解析顺序 :多重继承时,用于在子类中调用父类方法时确定调用哪个父类的方法 。
多重继承代码示例:
#!/usr/bin/python
#-*- coding:utf8 -*- class A(object):
def echo(self):
print "class_A" class B(A):
pass
#def echo(self):
# print "class_B" class C(A):
def echo(self):
print "class_C" class D(B,C):
pass
print D.__mro__ //python使用__mro__ 来存储线性化计算的结果。
ubuntu@yee:/tmp$ python mro.py
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <type 'object'>)
可以看到顺序为: D --> B --> C --> A --> object
当子类D调用echo方法时:
D().echo()
python 先搜索 D 本地类,再搜索B,有则返回,无则继续搜索C ,以此类推。
二、C3算法的原理
上面示例代码中所用到的正是C3算法,算法的表达式为:
L[D(B,C)]
= D + merge(L[B],L[C],[B,C]) 以上表达式也等同于:
==>
L[D(B,C)] = D + merge(mro(B,object),mro(C,object),[B,C]) ==> L[D(B,C)] = D + merge( [B,object], [C,
object],[B,C]) [] : 列表表达式
merge: C3算法的核心
《python高级编程》中是这样写的:
取第一个列表的头,也就是L[B,object] ,如果这个头不在任何表的尾部,那么将它加到Class D的线性化中,并且从合并中的列表里删除 ;否则查找下一个列表的头,如果是个好的表头则取出它。 需要注意的是: 表头指是第一个元素 ,尾部是指除表头之外的其它所有元素 。如[A,B,C,D,E,F],A是表头,[B,C,D,E,F]是尾部。
方式解析:
L(D(B,C)) = D + merge( [B,object] ,[C,object] , [B,C] )
#列表[B,object]的表头是B,没有出现在其它表([C,object] 、[B,C] )的尾部
= [D, B] + merge( [object], [C,object] , [C] )
#列表[C,object]的表头是C,没有出现在其它表([object] 、[C] )的尾部 ,注意 [C] 这个列表只有表头,没有尾部
= [D, B,C] + merge( [object] , [object] )
= [D, B,C,object]
通过以上的运算,可以得出跟 D().__mro__ 一样的结果
python MRO:C3算法的更多相关文章
- python学习笔记:第20天 多继承、MRO C3算法
目录 一.多继承 二.旧式类的MRO 三.新式类的MRO 四.super 一.多继承 之前已经学习过了继承,当出现了x是⼀种y的的时候,就可以使⽤继承关系,即"is-a" 关系.在 ...
- python面向对象(C3算法)(六)
1. 了解python2和python3类的区别 python2在2.3之前使用的是经典类, 2.3之后, 使用的是新式类 2. 经典类的MRO 树形结构的深度优先遍历 -> 树形结构遍历 cl ...
- MRO,C3算法
1了解python2和python3类的区别 python2在2.4之前使用的是经典类, 2.4之后, 使用的是新式类 class Foo: pass class Foo(object): pass ...
- python 面向对象(六)MRO C3算法 super
########################总结################ 面向对象回顾 类:对某一个事物的描述,对一些属性和方法的归类 class 类名: var=123#类变量 def ...
- python --- 21 MRO C3算法
一.python2.2之前用的是 经典类的MRO继承 ①深度递归继承 从左到右 ,一条路走到黑 ②广度继承 一层一层的继承 深度继承时 为 R 1 2 3 4 ...
- python多重继承C3算法
python多重继承的MRO算法选择: 经典方式.Python2.2 新式算法.Python2.3 新式算法(C3).Python 3中只保留了最后一种,即C3算法 C3算法的解析: 1.多继承UML ...
- day19 MRO C3算法 super()
1. MRO(Method Resolution Order):方法解析顺序,主要用于在多继承时判断调的属性的路径(来自于哪个类). 1.Python语言包含了很多优秀的特性,其中多重继承就是其中之一 ...
- MRO C3算法 super的运用
-------------态度决定成败,无论情况好坏,都要抱着积极的态度,莫让沮丧取代热心.生命可以价值极高,也可以一无是处,随你怎么去选择.# --------------------------- ...
- python 之C3算法
C3算法只要针对的Python2.3版本之后出现的新式类MRO(method resolution order) -------继承方法查询顺序;而经典类MRO则遵循的是深度优先遍历(树形结构) (1 ...
随机推荐
- Eclipse 添加 Source 源代码、Javadoc 文档
源代码 Source 按住 Ctrl 键,鼠标放到对应的类.方法上,出现 Open Declaration,Open Implementation ,可查看对应的实现.声明源代码. 也可以在[Proj ...
- tty
tty一词源于Teletypes,或teletypewriters,原来指的是电传打字机,是通过串行线用打印机键盘通过阅读和发送信息的东西,后来这东西被键盘和显示器取代,所以现在叫终端比较合适. 终端 ...
- 安装java8
很多软件都是在java基础上搭建的 ,所以使用的前提是搭建好java的环境,记录下 linux版本:centos7.2 一.下载 到官网下载最新的java8 链接 注意,因为官网需要同意协议才能下载, ...
- TensorFlow 常用函数与方法
摘要:本文主要对tf的一些常用概念与方法进行描述. tf函数 TensorFlow 将图形定义转换成分布式执行的操作, 以充分利用可用的计算资源(如 CPU 或 GPU.一般你不需要显式指定使用 CP ...
- docker下安装mysql
docker run -d -p 3306:3306 -v /root/docker/mysql/conf/mysql.cnf:/etc/mysql/conf.d/mysql.cnf -v /root ...
- 定期清理WordPress的文章修订版本
当WordPress编辑或修改文章时会自动保存生成一个修订版本,默认是每分钟1次.方便恢复早先撰写的版本.不过时间一长就会产生大量的冗余数据,加重服务器负担,拖慢数据加载.当所有发布的文章都已更新到最 ...
- CSS盒模型(Box Model)
阅读目录 1. 什么是CSS盒模型 2. IE盒模型和W3C盒模型 3. CSS3属性box-sizing 4. 关于盒模型的使用 在最初接触CSS的时候,对于CSS盒模型的不了解,撞了很多次的南墙呀 ...
- javascript没有长整型
记录一下前几天踩坑的经历. 背景:一个项目某一版之后很多用easyui的表格控件treegrid渲染的表格都显示不出来了 奇怪的地方主要有以下几点: 项目在测试环境才会这样,在本机能够正常运行,多次重 ...
- Django详细流程
一.设计表结构 我们以学生管理系统为例,讲解一下Django的基本操作.首先要设计一下表的结构,这里就不多解释 班级表结构: 表名:grades 字段:班级名称 gname 成立时间 gdate 女生 ...
- 版本控制工具 - Git
版本控制工具 - Git 安装完成后,打开Git Bash,这是一个命令行工具,用于操作仓库和仓库的文件.你可以通过命令将已经存在的项目变成仓库,也可以重新创建一个新项目再通过命令将其变成仓库,还可以 ...