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,主要用于在多继承时判断调的属性的路径( ...
随机推荐
- 左侧栏与右侧内容之锚点、offsetHeight、scrollTop()
常用功能 1.点击左侧,右侧相关内容随时点到. 2.滚动右侧信息,左侧标题随之显示背景. 第一点很简单,只要在左侧栏 <li><a href="#aaa"&g ...
- VS2013 自定义项目模板以及制作.vsix文件
一.环境检查 打开VS2013新建项目.如果在"其他项目类型"中不包含扩展性节点,则需要下载并安装vs2013 SDK. 二.创建项目模板 1,在VS中新建一个类库项目(此处仅以类 ...
- [Maven] Project build error: 'packaging' with value 'jar' is invalid. Aggregator projects require 'pom' as packaging.
将<packaging>jar</packaging> 改为<packaging>pom</packaging>
- iOS 警告收集快速消除
1.ld: warning: directory not found for option 去掉警告的方法 工程老是提示ld: warning: directory not found for opt ...
- Java Exception & RTTI
Exception Try { ... ... } catch (Exception ex) { …; throw new Throwable(ex); } catch (Throwable ex) ...
- Java 笔记 —— java 和 javac
Java 笔记 -- java 和 javac h2{ color: #4ABCDE; } a{ text-decoration: none !important; } a:hover{ color: ...
- [原创] Debian9上配置软件阵列
序言 软阵列是用软件实现的磁盘阵列. 准备工作 1. 更新系统 没啥,就他喵想用个最新的. apt update && apt upgrade 2. 安装mdadm 如果系统没有自带m ...
- WebRTC协议
webrtc协议介绍 MDN webrtc协议 ICE 交互式连接建立Interactive Connectivity Establishment (ICE) 是一个允许你的浏览器和对端浏览器建立连接 ...
- webpack前端构建工具学习总结(一)之webpack安装、创建项目
npm是随nodeJs安装包一起安装的包管理工具,能解决NodeJS代码部署上的很多问题: 常见的使用场景有以下几种: 允许用户从NPM服务器下载别人编写的第三方包到本地使用. 允许用户从NPM服务器 ...
- 如何使用事务码SMICM分析ABAP代码发起的HTTP请求的错误ICM_HTTP_SSL_PEER_CERT_UNTRUSTED
当我用CL_HTTP_CLIENT往一个外网的url发请求时,遇到错误:ICM_HTTP_SSL_PEER_CERT_UNTRUSTED 错误是从这段ABAP代码里抛出来的: CALL METHOD ...