多继承的继承顺序按照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)算法的更多相关文章

  1. Python的多继承问题-MRO和C3算法

    大部分内容转载自C3 线性化算法与 MRO 理解Python中的多继承 Python 中的方法解析顺序(Method Resolution Order, MRO)定义了多继承存在时 Python 解释 ...

  2. Python多继承之MRO算法

    MRO即Method Resolution Order   方法解析顺序,它的提出主要是为了解决Python中多继承时,当父类存在同名函数时,二义性的问题 下面先看一个例子: import inspe ...

  3. python中多继承C3算法研究

    在python的面向对象继承问题中,单继承简单易懂,全部接受传承类的属性,并可添加自带属性, 但是,在多继承情况下,会遇到多个被继承者的顺序问题,以及多次继承后查找前几次继承者需求属性时,可能不易发现 ...

  4. python基础之面向对象的多继承以及MRO算法

    内容梗概: 1. python多继承 2. python经典类的MRO 3. python新式类的MRO C3算法 1.python多继承 class Shen: def fly(self): pri ...

  5. python新式类继承------C3算法

    一.引入 mro即method resolution order,主要用于在多继承时判断调的属性的路径(来自于哪个类).之前查看了很多资料,说mro是基于深度优先搜索算法的.但不完全正确在Python ...

  6. Python多继承C3算法

    Python3 多继承的MRO算法选择.MRO(Method Resolution Order):方法解析顺序. Python3 只保留了C3算法! C3算法解析: 1.C3算法解析 C3算法:MRO ...

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

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

  8. Python多继承解析顺序的C3线性算法流程解析

    Python多继承MRO 在Python2.1中,采用了经典类,使用深度优先算法解析. Python2.2中,引入了新式类,使用深度优先算法和广度优先算法. 在Python2.3以后的版本中,经典类和 ...

  9. Python 多继承(新式类) 的mro算法

    转载自:http://www.cnblogs.com/panyinghua/p/3283831.html mro即method resolution order,主要用于在多继承时判断调的属性的路径( ...

随机推荐

  1. maven课程 项目管理利器-maven 1-1课程概述

    1 为什么使用maven? 多框架应用项目,jar包太多且冲突,为了解决这个问题,引入maven.(类似还有ant,gradle) 2 课程概述 maven快速入门 maven核心知识 maven建造 ...

  2. css 引入方式以及css的选择器

    一.css的引入方式: 1.行内样式 <div> <p style="color: red">我是一个段落</p> </div> 2 ...

  3. css颜色 hsla 和line-gradient

    h 表示色调 从0-360 s 饱和度  0 - 100% l 亮度    0 -100% a 透明度  0-1

  4. BZOJ1563: [NOI2009]诗人小G(决策单调性 前缀和 dp)

    题意 题目链接 Sol 很显然的一个dp方程 \(f_i = min(f_j + (sum_i - sum_j - 1 - L)^P)\) 其中\(sum_i = \sum_{j = 1}^i len ...

  5. 在使用angular和swiper插件中的一些问题

    在使用angular获取swiper图片的时候swiper就不会轮播. 解决方法: 1.使用计时器的方法,不是最优 settimeOut(function(){ mySwiper = new Swip ...

  6. svg保存为图片下载到本地

    今天给大家说一个将svg下载到本地图片的方法,这里我不得不吐槽一下,为啥博客园不可以直接上传本地文件给大家用来直接下载分享呢,好,吐槽到此为止! 这里需要用到一个js文件,名字自己起,内容如下: (f ...

  7. (C# 基础) 接口

    接口是表示一组函数成员,而不实现成员的引用类型.类和结构可以实现接口. 例如BCL声明了一个叫做IComparable的接口,包含了一个CompareTo方法, 但没有实现其方法,用“:”结尾. pu ...

  8. 开发中常用的sql语句二

    sql 数字全角半角转换 create FUNCTION dbo.ConvertWordAngle ( ), --要转换的字符串 @flag bit --转换标志,0转换成半角,1转换成全角 )) A ...

  9. SaberSama【css总结】

    为什么要转过来呢? 因为我觉到,同样是一个初学者,应该互相学习,交流. css:Cascading Style Sheets 层叠样式表 CSS引入方式: 1.内嵌: <p style=&quo ...

  10. java文件

    File类 为了很方便的代表文件的概念,以及存储一些对于文件的基本操作,在java.io包中设计了一个专门的类——File类. 在File类中包含了大部分和文件操作的功能方法,该类的对象可以代表一个具 ...