Python 多继承与MRO-C3算法
继承关系图:树结构

广度优先遍历:先找A,再找B、C,最后找D、E。(顺序:A、B、C)
深度优先遍历:先找A,再找B,接着找D、E(把B里面找完);然后找C。(顺序:A、B、D、E、C)
MRO-C3 算法:很像深度优先遍历,但不是。(注意:树结构)


范例演示:定义类时保持和上图一样的数结构。
>>> class D:
name = 'd' >>> class E:
pass >>> class C:
name = 'c' >>> class B(D,E): #继承多个父类,如:遗传爸爸和妈妈的基因。
pass >>> class A(B,C): #继承多个类,如:爸爸和妈妈都会吃饭,但是每个人吃饭的方式不一样,看如何遗传
pass >>> print(A.name) #类A继承了B类和C类,它会先去B类(B类继承了D类和E类)里面,找结果是pass;然后去B类里面的D类找,结果用name属性。
#如果还没有的话就回去E类里面找。
d
>>>
>>> print(A.mro()) #mro()方法,是在类里面的,它会自己计算出搜索顺序。【MRO-C3算法】
[<class '__main__.A'>, <class '__main__.B'>, <class '__main__.D'>, <class '__main__.E'>, <class '__main__.C'>, <class 'object'>]
>>>
违犯MRO-C3规则的树结构:由于冲突导致的不能继承。


范例演示:验证违犯MRO-C3规则的树结构。
>>> class A: #爸爸
pass >>> class B: #妈妈
pass >>> class C(A,B): #儿子,先继承爸爸的属性
pass >>> class D(B,A): #女儿,先继承妈妈的属性
pass >>> class E(C,D):
#会报错,因为这个树结构是违法MRO-C3规则的。由于冲突导致的不能继承。
#这个类E继承了儿子和女儿的属性;近亲不能结婚。
pass Traceback (most recent call last):
File "<pyshell#32>", line 1, in <module>
class E(C,D):
TypeError: Cannot create a consistent method resolution
order (MRO) for bases A, B
>>>
Python 多继承与MRO-C3算法的更多相关文章
- python学习笔记:第20天 多继承、MRO C3算法
目录 一.多继承 二.旧式类的MRO 三.新式类的MRO 四.super 一.多继承 之前已经学习过了继承,当出现了x是⼀种y的的时候,就可以使⽤继承关系,即"is-a" 关系.在 ...
- MRO,C3算法
1了解python2和python3类的区别 python2在2.4之前使用的是经典类, 2.4之后, 使用的是新式类 class Foo: pass class Foo(object): pass ...
- python 面向对象(六)MRO C3算法 super
########################总结################ 面向对象回顾 类:对某一个事物的描述,对一些属性和方法的归类 class 类名: var=123#类变量 def ...
- Python多继承之MRO算法
MRO即Method Resolution Order 方法解析顺序,它的提出主要是为了解决Python中多继承时,当父类存在同名函数时,二义性的问题 下面先看一个例子: import inspe ...
- python小兵 面向对象继承super和c3算法
python多继承 在前面的学习过程中. 我们已经知道了Python中类与类之间可以有继承关系. 当出现了x是一种y的的时候. 就可以使⽤继承关系. 即"is-a" 关系. 在继承 ...
- python --- 21 MRO C3算法
一.python2.2之前用的是 经典类的MRO继承 ①深度递归继承 从左到右 ,一条路走到黑 ②广度继承 一层一层的继承 深度继承时 为 R 1 2 3 4 ...
- python的垃圾回收机制 继承的顺序C3算法
Python垃圾回收 -- 引用计数 -- Python为每个对象维护一个引用计数 -- 当引用计数为0的 代表这个对象为垃圾 -- 标记清除 - ...
- day19 MRO C3算法 super()
1. MRO(Method Resolution Order):方法解析顺序,主要用于在多继承时判断调的属性的路径(来自于哪个类). 1.Python语言包含了很多优秀的特性,其中多重继承就是其中之一 ...
- MRO C3算法 super的运用
-------------态度决定成败,无论情况好坏,都要抱着积极的态度,莫让沮丧取代热心.生命可以价值极高,也可以一无是处,随你怎么去选择.# --------------------------- ...
- 21 MRO C3算法
三十九 MRO 多继承的继承顺序 一.python2.2之前用的是 经典类的MRO继承 ①深度递归继承 从左到右 ,一条路走到黑 ②广度继承 一层一层的继承 深度继承时 ...
随机推荐
- java-代码生成器
package ormRex; import java.io.File; import java.io.IOException; import java.io.PrintWriter; import ...
- c++官方文档-copy constructor
#include <iostream> using namespace std; class Example5 { string* ptr; public: Example5(const ...
- Java图片压缩
package com.test; import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.image.codec.jpeg.JPEGIma ...
- 关于php中的exec命令
这个命令 一般是被禁用的 一些特殊需求的时刻 可以启用 比如 调用系统上的一些数据或者命令 $command ='/www/wwwroot/t.6328.net/Public/cfile/test' ...
- 代码参考: css3动画—— 星系轨道
CSS3橙色的星球绕轨道公转动画 http://hovertree.com/texiao/css3/24/ 例子 http://hovertree.com/h/bjaf/css3xingxi.htm ...
- linux inode 详解 / 线上inode爆满解决方案
本文大量参考阮一峰大神博客,整理笔记 之所以写inode文章是由于一次线上问题,引发对inode深入的思考. 磁盘的inode监控与磁盘空间的监控同等重要,线上服务器一定要做好磁盘inode与磁盘空间 ...
- django相关
后台运行django:https://blog.csdn.net/rnger/article/details/79907884 nohup python manage.py runserver 0.0 ...
- PHP微信关注自动回复文本消息。
服务器配置URL默认接受 $_GET["echostr"] 配置成功. public function GetShow(){ $token = $this->token; / ...
- Slava and tanks 877C
C. Slava and tanks time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- Linux文件的时间
关于Linux文件的ctime.atime和mtime等几个时间的介绍,推荐<Linux的3个文件时间>比较不错,这篇文章已经介绍的比较全面了,但是本文对它做进一步的解释,并对一些情况进行 ...