Python探路-多重继承
多重继承都会让python初学者很疑惑,哪怕当时看完,过一段时间也就遗忘了,因此写下了本文,希望借此能够让python初学者能够比较深刻的记住。
多重继承查找父类的方法有两种:
1、深度优先---针对经典类,即python2.2之前和python2.7
2、C3算法---针对新式类
一、深度优先:
可从某个定点v出发,访问此顶点,然后一次从v的违背访问的邻接点触发深度优先遍历图,直至途中所有和v有路径相同的顶点都被访问到;若此时途中尚有顶点未被访问,则另选途中一个未曾被访问的顶点做开始点。
例:
结果:v1, v2, v4, v5, v3, v7, v6
2、C3 MRO算法:
这里的关键在于 merge,其输入是一组列表,按照如下方式输出一个列表:
1)检查第一个列表的头元素(如 L[B] 的头),记作 H。
L[B]=[B]+L[D]+L[E]+[D]+[E]
=[B] + merge([D,object],[E,object],[D],[E])
=[B,D] + merge([object],[E,object],[E])
=[B,D,E,object]
其中,[B,D,E,object]中的B代表头,其他都是尾
2)若 H 未出现在其它列表的尾部,则将其输出,并将其从所有列表中删除,然后回到步骤1;否则,取出下一个列表的头部记作 H,继续该步骤。
上面的merge([D,object],[E,object],[D],[E])中,D未出现其他列表的尾部所以输出D
3) 重复上述步骤,直至列表为空或者不能再找出可以输出的元素。如果是前一种情况,则算法结束;如果是后一种情况,说明无法构建继承关系,Python 会抛出异常。
如果出现merge([D,E,object],[E,D,object],[D],[E]),即D又是[E,D,object]的尾,而E又是[D,E,object]的尾,D和E都不能输出,即出现了D和E相互继承的关系,会拋异常
其实举个例子更能说明问题:
结果大概是这样:
mro(A)=[A] + merge(mro(B),mro(C),[B,C])
mro(B) = [B] + mro(D)
mro(D)=[D,O]
所以:mro(A)= [A] + merge(mro(B),mro(C),[B,C])
= [A] + merge([B,mro(D)],[C,O],[B,C])
由于B不在任何列表的列尾,所以上式等于:
= [A,B]+merge([mro(D)],[C,O],[C])
= [A,B]+merge([D,O],[C,O],[C])
= [A,B,D]+merge([O],[C,O],[C])
由于O为[C,O]的列尾,所以寻找下一个C,所以最终结果为:
= [A,B,D,C,O]
注:对于一个列表[A,B,C],A为列头,[B,C]为列尾
Python探路-多重继承相关推荐
- Python 面向对象 —— 多重继承
多重继承(一个子类同时继承多个父类),容易造成混乱,即如果两个父类又相同的方法名和变量名时,无法确定继承哪一个. 正因如此,Java 等语言中并不支持多重继承(Java 是单继承多接口).Python ...
- python继承多重继承
一,基本语法 class MyClass(BaseClass):def __init__(self):print('...') class MyDefineClass(object):def __in ...
- python super 多重继承_解决python super()调用多重继承函数的问题
当类间继承关系很简单时,super()的使用很简单. class A(object): def __init__(self): print('a') class B(A): def __init__( ...
- Python类多重继承
在 Python中有6种标准数据类型,分别为:Number(数字).String(字符串).List(列表).Tuple(元组).Sets(集合)和Dict(字典).而根据内存中的内容是否可变,分为可 ...
- python多继承顺序_Python多重继承方法解析顺序(MRO构建算法)
分界 python的MRO算法有新旧两种,但并不是以python2和python3为界,具体的分隔为:在python2中如果定义类的时候没有指定父类是object,即定义为 class A: pass ...
- python 构造函数继承_Python多重继承的异构构造器
在Python里面,如果你使用上Qt,SQLAlchemy,Twisted之类各种大型类库时候,有时候多重继承Multiple Inheritance是个简单的解决方法,但是多重继承的复杂性总容易造成 ...
- 在职研究生(多重继承)Python
目录 题目描述 思路分析 AC代码 题目描述 1.建立如下的类继承结构: 1)定义一个人员类CPeople,其属性(保护类型)有:姓名.性别.年龄: 2)从CPeople类派生出学生类CStudent ...
- python多重继承初始化顺序_Python 多重继承顺序
本文借鉴自 http://www.cnblogs.com/panyinghua/p/3283726.html 当类有多个超类,而且超类中有相同的方法时,继承顺序就很重要,如下: class A (de ...
- Python中的多重继承
分享一个大牛的人工智能教程.零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击http://www.captainbed.net 继承是面向对象编程的一个重要的方式,通过继承,子类就 ...
- pythonsuper多重继承_python多重继承实例 python多重继承下super问题
python的多重继承问题有些事,有些人,有些风景,一旦入眼入心,即便刹那,也是永恒.当生活心怀歹毒地将一切都搞成了黑色幽默,小编顺水推舟把自己变成了一个受过高等教育的流氓. 楼上的回答的很正确,简单 ...
最新文章
- 数据集转换_“2000坐标”成了标配,你还不懂坐标系定义和转换吗?
- 狼行天下:追寻狼迹内蒙生态行第二天(续1)
- omitting directory `folder/'
- [C++11]move资源的转移
- Java父类强制转换子类原则
- 各种资源(持续更新中)
- c++求n的几次方_14.八年级数学:若a+b+c=1,怎么求 a+b+c的值?分式培优拓展
- pe系统如何读取手机_图文详解怎么用pe重做系统
- Java中equals()方法和==的区别分析
- Azkaban 安装
- 【线性代数】矩阵及其运算
- win10远程桌面Android软件,微软远程桌面安卓版
- ascii码值为负数_C语言字符型数据的ASCII码值为何是负数?
- 《少有人走的路-心智成熟的旅程》读书分享
- 美国的网络空间安全国家战略补充材料
- DEGUG修改BW表中数据以及修改更改日志
- 微信小程序的校园二手物品交易平台系统 uniapp 小程序
- Laravel Database——查询构造器与语法编译器源码分析 (上)
- oracle预防性维护计划,Oracle dba 日常管理
- 云原生时代,青云QingCloud的“极简”之道
热门文章
- 最新常用会计科目表及详细解释
- 恋与抽卡模拟器网页_恋与制作人抽卡模拟器-恋与制作人抽卡模拟器软件下载v1.14.1202-k73游戏之家...
- u检验中的查u界值表_《医学统计学》
- 智慧工地农民工实名制管理系统
- 微信无法绑定手机号的解决方案
- 学计算机办公文员软件,办公文员必须掌握的办公软件有哪些
- springcloud阿里巴巴五大组件_阿里巴巴内部独家微服务全解手册已“重现江湖”大厂核心技术,你确定不了解一下?...
- apifox通过若依平台登录传参获取token
- Win7系统无法被远程桌面连接如何解决
- 共享远程计算机文件夹,怎么远程访问共享文件夹