多重继承都会让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探路-多重继承相关推荐

  1. Python 面向对象 —— 多重继承

    多重继承(一个子类同时继承多个父类),容易造成混乱,即如果两个父类又相同的方法名和变量名时,无法确定继承哪一个. 正因如此,Java 等语言中并不支持多重继承(Java 是单继承多接口).Python ...

  2. python继承多重继承

    一,基本语法 class MyClass(BaseClass):def __init__(self):print('...') class MyDefineClass(object):def __in ...

  3. python super 多重继承_解决python super()调用多重继承函数的问题

    当类间继承关系很简单时,super()的使用很简单. class A(object): def __init__(self): print('a') class B(A): def __init__( ...

  4. Python类多重继承

    在 Python中有6种标准数据类型,分别为:Number(数字).String(字符串).List(列表).Tuple(元组).Sets(集合)和Dict(字典).而根据内存中的内容是否可变,分为可 ...

  5. python多继承顺序_Python多重继承方法解析顺序(MRO构建算法)

    分界 python的MRO算法有新旧两种,但并不是以python2和python3为界,具体的分隔为:在python2中如果定义类的时候没有指定父类是object,即定义为 class A: pass ...

  6. python 构造函数继承_Python多重继承的异构构造器

    在Python里面,如果你使用上Qt,SQLAlchemy,Twisted之类各种大型类库时候,有时候多重继承Multiple Inheritance是个简单的解决方法,但是多重继承的复杂性总容易造成 ...

  7. 在职研究生(多重继承)Python

    目录 题目描述 思路分析 AC代码 题目描述 1.建立如下的类继承结构: 1)定义一个人员类CPeople,其属性(保护类型)有:姓名.性别.年龄: 2)从CPeople类派生出学生类CStudent ...

  8. python多重继承初始化顺序_Python 多重继承顺序

    本文借鉴自 http://www.cnblogs.com/panyinghua/p/3283726.html 当类有多个超类,而且超类中有相同的方法时,继承顺序就很重要,如下: class A (de ...

  9. Python中的多重继承

    分享一个大牛的人工智能教程.零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击http://www.captainbed.net 继承是面向对象编程的一个重要的方式,通过继承,子类就 ...

  10. pythonsuper多重继承_python多重继承实例 python多重继承下super问题

    python的多重继承问题有些事,有些人,有些风景,一旦入眼入心,即便刹那,也是永恒.当生活心怀歹毒地将一切都搞成了黑色幽默,小编顺水推舟把自己变成了一个受过高等教育的流氓. 楼上的回答的很正确,简单 ...

最新文章

  1. 数据集转换_“2000坐标”成了标配,你还不懂坐标系定义和转换吗?
  2. 狼行天下:追寻狼迹内蒙生态行第二天(续1)
  3. omitting directory `folder/'
  4. [C++11]move资源的转移
  5. Java父类强制转换子类原则
  6. 各种资源(持续更新中)
  7. c++求n的几次方_14.八年级数学:若a+b+c=1,怎么求 a+b+c的值?分式培优拓展
  8. pe系统如何读取手机_图文详解怎么用pe重做系统
  9. Java中equals()方法和==的区别分析
  10. Azkaban 安装
  11. 【线性代数】矩阵及其运算
  12. win10远程桌面Android软件,微软远程桌面安卓版
  13. ascii码值为负数_C语言字符型数据的ASCII码值为何是负数?
  14. 《少有人走的路-心智成熟的旅程》读书分享
  15. 美国的网络空间安全国家战略补充材料
  16. DEGUG修改BW表中数据以及修改更改日志
  17. 微信小程序的校园二手物品交易平台系统 uniapp 小程序
  18. Laravel Database——查询构造器与语法编译器源码分析 (上)
  19. oracle预防性维护计划,Oracle dba 日常管理
  20. 云原生时代,青云QingCloud的“极简”之道

热门文章

  1. 最新常用会计科目表及详细解释
  2. 恋与抽卡模拟器网页_恋与制作人抽卡模拟器-恋与制作人抽卡模拟器软件下载v1.14.1202-k73游戏之家...
  3. u检验中的查u界值表_《医学统计学》
  4. 智慧工地农民工实名制管理系统
  5. 微信无法绑定手机号的解决方案
  6. 学计算机办公文员软件,办公文员必须掌握的办公软件有哪些
  7. springcloud阿里巴巴五大组件_阿里巴巴内部独家微服务全解手册已“重现江湖”大厂核心技术,你确定不了解一下?...
  8. apifox通过若依平台登录传参获取token
  9. Win7系统无法被远程桌面连接如何解决
  10. 共享远程计算机文件夹,怎么远程访问共享文件夹