python的多继承C3(mro)算法
多继承的继承顺序按照C3算法进行顺序继承
例一

按照深度A类从左往右有三条可继承的"路"
先按照深度优先的算法,将每一路的每一个节点加到列表中
B = [B,D,F,H]
C = [C,E,G,H]
D = [D,F,H]
A = [B,C,D] A的广度顺序
得到四个列表,四个列表按照头尾的方式进行比较,如何划分头尾呢.

第一个为头,剩下的都是尾,
整体的算法介绍
比较第一个列表的头是都在其他列表中的尾部出现,如果出现,则跳过这个列表,直接到下一个列表的头部,再次判断是否出现在其他列表的尾部,如果都没有出现就将这个元素放进一个新的列表,
然后把所有列表中的这个元素删除,以此类推,直到把所有的列表删除为空,得出的新列表就是继承的顺序.
过程:
1 [B,D,F,H] [C,E,G,H] [D,F,H] [B,C,D] new_list[B,]
第一次比较B,所有列表的尾部没有B,添加B到新列表,然后删除所有的头部B
2 [D,F,H] [C,E,G,H] [D,F,H] [C,D] new_list[B,]
比较头部D,D在其他的尾部中存在,跳过这次比较,直接进入下一个列表比较C
3 [D,F,H] [E,G,H] [D,F,H] [D] new_list[B,C]
C在其他列表的尾部不存在,将C添加至新列表,删除所有的头部C
4 [F,H] [E,G,H] [F,H] new_list[B,C,D]
再次回到第一个列表比较D,D没有存在其他列表的尾部添加D到新列表,然后删除所有的头部D
5 [H] [E,G,H] [H] new_list[B,C,D,F]
6 [H] [G,H] [H] new_list[B,C,D,F,E]
7 [H] [H] [H] new_list[B,C,D,F,E,G]
8 [] [] [] new_list[B,C,D,F,E,G,H] 所以最后的继承顺序就是A,B,C,D,F,E,G,H,object
例二

流程:因为有多个分叉,所以需要先计算每一个分叉的mro顺序:
从最左边的最高杈开始计算它的mro
分叉B:[B] [B,E](父类的, 按照深度优先) [B,D](自己继承的按照广度优先)
计算结果:[B,E,D]
分叉C:[C] [C,D] [C,F]
计算结果:[C,D,F]
计算完上面的两个叉后,就变成了一个叉.

再次进行计算:
[A] [B, E, D] [C, D, F] [B, C] new_list[A,]
[] [E, D] [C, D, F] [C] new_list[A,B,]
[] [D] [C, D, F] [C] new_list[A,B,E,]
[] [D] [D, F] [] new_list[A,B,E,C,]
[] [] [F] [] new_list[A,B,E,C,D,]
[] [] [] [] new_list[A,B,E,C,D,F]
所以最后的继承顺序就是A,B,E,C,D,F,object
python的多继承C3(mro)算法的更多相关文章
- Python的多继承问题-MRO和C3算法
大部分内容转载自C3 线性化算法与 MRO 理解Python中的多继承 Python 中的方法解析顺序(Method Resolution Order, MRO)定义了多继承存在时 Python 解释 ...
- Python多继承之MRO算法
MRO即Method Resolution Order 方法解析顺序,它的提出主要是为了解决Python中多继承时,当父类存在同名函数时,二义性的问题 下面先看一个例子: import inspe ...
- python中多继承C3算法研究
在python的面向对象继承问题中,单继承简单易懂,全部接受传承类的属性,并可添加自带属性, 但是,在多继承情况下,会遇到多个被继承者的顺序问题,以及多次继承后查找前几次继承者需求属性时,可能不易发现 ...
- python基础之面向对象的多继承以及MRO算法
内容梗概: 1. python多继承 2. python经典类的MRO 3. python新式类的MRO C3算法 1.python多继承 class Shen: def fly(self): pri ...
- python新式类继承------C3算法
一.引入 mro即method resolution order,主要用于在多继承时判断调的属性的路径(来自于哪个类).之前查看了很多资料,说mro是基于深度优先搜索算法的.但不完全正确在Python ...
- Python多继承C3算法
Python3 多继承的MRO算法选择.MRO(Method Resolution Order):方法解析顺序. Python3 只保留了C3算法! C3算法解析: 1.C3算法解析 C3算法:MRO ...
- python学习笔记:第20天 多继承、MRO C3算法
目录 一.多继承 二.旧式类的MRO 三.新式类的MRO 四.super 一.多继承 之前已经学习过了继承,当出现了x是⼀种y的的时候,就可以使⽤继承关系,即"is-a" 关系.在 ...
- Python多继承解析顺序的C3线性算法流程解析
Python多继承MRO 在Python2.1中,采用了经典类,使用深度优先算法解析. Python2.2中,引入了新式类,使用深度优先算法和广度优先算法. 在Python2.3以后的版本中,经典类和 ...
- Python 多继承(新式类) 的mro算法
转载自:http://www.cnblogs.com/panyinghua/p/3283831.html mro即method resolution order,主要用于在多继承时判断调的属性的路径( ...
随机推荐
- .NET Core 部署到CentOS–2.创建守护进程, 通过Nginx公网访问
继上一篇, 我们确定在内网可以通过 "http://localhost:5000",可以访问到站点后,接下来我们要配置"守护进程","Nginx公网8 ...
- JavaScript 函数 (function)
//声明(有参数.有返回值) function fun() { var name = '小黑'; ) { name = arguments[]; //接受参数 } alert(name); retur ...
- 内存分配详解 malloc, new, HeapAlloc, VirtualAlloc,GlobalAlloc
很多地方都会使用内存,内存使用过程中操作不当就容易崩溃,无法运行程序,上网Google学习一下,了解整理下他们之间的区别以及使用 ,获益匪浅 0x01 各自的定义和理解 (1)先看GlobalAllo ...
- Hive总结
一.什么是Hive 1.Hive 由 Facebook 实现并开源 2.是基于 Hadoop 的一个数据仓库 3.可以将结构化的数据映射为一张数据库表 4.并提供 HQL(Hive SQL)查询功能 ...
- sass-基础
导入: sass的导入(@import)规则和CSS的有所不同,编译时会将@import的scss文件合并进来只生成一个CSS文件. 但是如果你在sass文件中导入css文件如@import 'res ...
- 《SQLServer删除重复数据的方法》
方法一: declare @max integer,@id integer open cur_rows fetch cur_rows into @id,@max begin set rowcount ...
- Android Recyclerview隐藏item的所在区域显示大空白问题的解决方案
最近搞了下Recyclerview,做了增加.删除item的功能.item上方有卡签 插个图片看下效果,点击底下的添加上去,同时,底下的item消失,这个用notifyItemInserted和not ...
- Android GreenDAO 3.0 不修改版本号的情况下增加、删除表、添加字段
最近项目中使用了GreenDAO的3.0以上的版本,出现需要增加删除表的需求,刚开始用,发现官方对增加和删除的方法是每次去修改数据库版本号,版本一旦升级,那么原来数据库中的表会全部删除再重建.太麻烦, ...
- Jetty服务器的使用
Jetty 是一个开源的servlet容器,它为基于Java的web容器,例如JSP和servlet提供运行环境.Jetty是使用Java语言编写的,它的API以一组JAR包的形式发布.开发人员可以将 ...
- php网站修改默认访问文件的nginx配置
搭建好lnmp后,有时候并不需要直接访问index.php,配置其他的默认访问文件比如index.html这时候需要配置一下nginx才能访问到你想要设置的文件 直接上代码,如下是我的配置的一份简单的 ...