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算法的更多相关文章

  1. python学习笔记:第20天 多继承、MRO C3算法

    目录 一.多继承 二.旧式类的MRO 三.新式类的MRO 四.super 一.多继承 之前已经学习过了继承,当出现了x是⼀种y的的时候,就可以使⽤继承关系,即"is-a" 关系.在 ...

  2. python面向对象(C3算法)(六)

    1. 了解python2和python3类的区别 python2在2.3之前使用的是经典类, 2.3之后, 使用的是新式类 2. 经典类的MRO 树形结构的深度优先遍历 -> 树形结构遍历 cl ...

  3. MRO,C3算法

    1了解python2和python3类的区别 python2在2.4之前使用的是经典类, 2.4之后, 使用的是新式类 class Foo: pass class Foo(object): pass ...

  4. python 面向对象(六)MRO C3算法 super

    ########################总结################ 面向对象回顾 类:对某一个事物的描述,对一些属性和方法的归类 class 类名: var=123#类变量 def ...

  5. python --- 21 MRO C3算法

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

  6. python多重继承C3算法

    python多重继承的MRO算法选择: 经典方式.Python2.2 新式算法.Python2.3 新式算法(C3).Python 3中只保留了最后一种,即C3算法 C3算法的解析: 1.多继承UML ...

  7. day19 MRO C3算法 super()

    1. MRO(Method Resolution Order):方法解析顺序,主要用于在多继承时判断调的属性的路径(来自于哪个类). 1.Python语言包含了很多优秀的特性,其中多重继承就是其中之一 ...

  8. MRO C3算法 super的运用

    -------------态度决定成败,无论情况好坏,都要抱着积极的态度,莫让沮丧取代热心.生命可以价值极高,也可以一无是处,随你怎么去选择.# --------------------------- ...

  9. python 之C3算法

    C3算法只要针对的Python2.3版本之后出现的新式类MRO(method resolution order) -------继承方法查询顺序;而经典类MRO则遵循的是深度优先遍历(树形结构) (1 ...

随机推荐

  1. 第六篇--Ubuntu画图软件

    有时图片需要经过处理,下载一个pinta软件 sudo apt-get install pinta 安装后可能不知道位置,没关系,点击图片右键,选择打开软件为pinta就行了.

  2. ASP.NET知识点汇总

    一 ,html属性20181113常用的居中方法1 text-align2 float3 margin (margin-left matgin-right margin-bottom margin-t ...

  3. 应用调试(一)strace

    目录 编译 使用 原理 深入文档 title: 应用调试(一)strace date: 2019/1/15 23:35:14 toc: true --- 编译 #tar -xjf strace-4.5 ...

  4. SMB(Server Message Block) Protocal Research

    catalogue . 什么是SMB . 基础SMB协议 . SMB Clients and Servers 1. 什么是SMB 全世界有很多的客户端和服务端软件实现了SMB协议,全部windows工 ...

  5. Centos 7最小化部署apollo

    https://github.com/nobodyiam/apollo-build-scripts

  6. GO 基础

    基本语法练习 打印 乘法表 package main import ("fmt") func main(){ for n:=1;n<=9;n++{ for m:=1;m< ...

  7. A fine property of the convective terms of axisymmetric MHD system, and a regularity criterion in terms of $\om^\tt$

    In [Zhang, Zujin; Yao, Zheng-an. 3D axisymmetric MHD system with regularity in the swirl component o ...

  8. Nginx web 服务器 安装篇

    Nginx介绍: 静态web服务器有Nginx .Apache .lighttpd等 目前国内用的最常见的就是Nginx 和Apache 是一个开源的.支持高性能.高并发的www服务和代理服务软件,N ...

  9. Django小技巧——使用package管理app

    在一个学习视频上看见的小技巧,遂记录下来. 1. 如下图所示,项目中有多个app,本技巧要解决的问题是集中管理这多个app,将其放入一个package下集中管理,改善项目的视图环境 2. 建立一个pa ...

  10. php7 + 新特性 部分

    三目运算符: 以前:$type = isset($_GET['type']) ? $_GET['type'] : '测试'; php7.0: $type = $_GET['type'] ?? '测试' ...