Python多继承mro
在python语言里是支持继承这一概念的,也就是一个class可以继承一些其他class方法或者数据,在继承的时候有的比较简单,比如下面这段代码就是classM继承了classA
class A():def say(self):print("A")
class M(A):passm = M()
m.say()
再用say这个函数时就会printA
但在更多情况下,继承关系可能会比这个更复杂,比如下面这段代码B继承了A,M又继承了B,A和B就同时是M的基类
class A(object):def say(self):print("A")class B(A):def say(self):print("B")class M(B):passm = M()
m.say()
再次调用say这个函数是就会打印出B
为什么会打印B呢?可以想一下,如果觉得想通了,可以看下下面这个例子
class A(object):def say(self):print("A")class B():def say(self):print("B")class M(A,B):passm = M()
m.say()
把继承关系改一下,B不在继承A,而是让M同时继承A和B,让我们再看一下打印的结果
还是A,如果感觉简单的话,不妨换一下
class A(object):def say(self):print("A")class B():def say(self):print("B")class C(A):passclass M(C,B):passm = M()
m.say()
多了 classC,让C去继承A,M不在继承A和B,而是继承C和B,这次的结果会是什么呢?
结果是A。如果觉得还是简单,可以试一下接下来的代码
class A(object):def say(self):print("A")class B(A):def say(self):print("B")class C(A):passclass M(C,B):passm = M()
m.say()
其他都没变,让B也去继承A,结果会是什么呢?
结果是B,你猜对了吗?
举得这几个例子只是说,在仅有这么几个class的情况下,不同的继承关系已经会让你稍微有点迷了。在Python里面,一个class如何去从它的父类里面找应该优先使用哪个父类的函数,这个顺序就叫mro。Method Resolution Order,mro是每一个类会把它自己和所有父类做一个线性化serialization,说白了就是把它所有继承的类和它自己做一个排序,在排序里面,保证自己是最高优先级,在它要调用一个方法或寻求一个数据的时候,它会按照这个队列的优先级顺序从前往后找。如果想获取一个类的mro,也就是一个类的继承的优先级顺序 有两种方法:
- .__mro__
- .mro()
class A(object):def say(self):print("A")class B(A):def say(self):print("B")class C(A):passclass M(C,B):passm = M()
# print(M.mro())
print(M.__mro__)
m.say()
可以看到M的mro是M、C、B、A、object这也就解释了为什么会打印B,因为B的优先级在A前,M和C没有打印的数据。
如果B没有继承A,M的mro的优先级就是M、C、A、B,结果就是A。
当建立一个新的类且继承其他类的时候,首先会计算出mro,当调用这个方法或使用这个类的数据的时候,它会根据mro依次往前找每一个在优先级列表的上的类有没有这个方法或数据。上面的例子当调用say方法时,会先从M里面找M里面没有再去C里面找,C也没有就去B,B里面有数据就会用B里面的数据,不会再往下走,这个就是继承和mro的关系
Python中的mro用的c3的算法,之所以叫c3,是因为在三个属性下都可以做到consistent满足三个属性:
第一个属性:extended precedence graph
pass
第二个:local precedence order
局部优先顺序,当一个类继承了多个类的时候,会优先使用写在前面的类,不仅如此,当有其他类使用这个继承其他类的类的时候,也会保持这个特性
第三个:monotonicity
单调性,子类不改变父类的方法
Python多继承mro相关推荐
- Python多继承mro示例
Python多继承mro示例 以下是python方法解析顺序的示例,详细的解释见代码的注释部分. # 1 解释python mro的执行顺序,详见数字序号的顺序 class Base(object): ...
- python 多继承与super使用详解_继承中的MRO与super详解
Python进阶-继承中的MRO与super 写在前面如非特别说明,下文均基于Python3 摘要 本文讲述Python继承关系中如何通过super()调用"父类"方法,super ...
- Python - 多继承与MRO
(一)多继承 网上关于多继承.MRO和C3算法的讲解比较多,在此不再赘述. 我们可以利用类的__mro__ 属性或者 mro() 方法查看某个类的MRO列表(方法调用顺序). (二)经典案例 当执 ...
- python中的MRO与多继承
相关概念: MRO:Method Resolution Order,即方法解析顺序,是python中用于处理二义性问题的算法 二义性: python支持多继承,多继承的语言往往会遇到以下两类二义性的问 ...
- python基础 继承
继承 继承指的是类与类之间的关系,是一种什么"是"什么的关系,继承的功能之一就是用来解决代码重用问题 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父 ...
- python面向对象继承_Python 面向对象 --- 继承
目标 单继承 多继承 面向对象三大特性 1,封装 根据 职责 将 属性 和 方法 封装 到以抽象的 类 中 2,继承 实现代码的重用,相同的代码不需要重复的缩写 3,多态 不同的对象调用相同的方法,产 ...
- Python的继承多态
Python的继承多态 文章目录 Python的继承多态 一.私有属性和私有方法 01. 应用场景及定义方式 02. 伪私有属性和私有方法 二.单例 01. 单例设计模式 单例设计模式的应用场景 02 ...
- python多继承顺序及分配,python多继承的查找顺序是什么?
1.查找顺序 (1)本地优先,自己定义或重写的方法优先.本地没有的,按照继承列表,从左往右查找: (2)单调性,所有子类,也要满足查找顺序.也就是说 A 继承 B C,A 会先找 B 再找 C.但是在 ...
- Python 多继承
1.多继承 概念 子类 可以拥有 多个父类,并且具有 所有父类的 属性 和 方法: 例如:孩子 会继承自己 父亲 和 母亲 的 特性: 语法 class 子类(父类1,父类2...)pass clas ...
最新文章
- liunx查看python的site-packages路径
- 阿里技术人的成长路径是什么?
- Android应用开发:网络编程-1
- MFC单文档程序加载web网站和html文件
- [label][转载][JavaSript]querySelectorAll 方法相比 getElementsBy 系列方法有什么区别?
- node运行swagger-editor
- mybatis连接oracle_Mybatis 系列 0:初恋Mybatis
- 前端学习(3071):vue+element今日头条管理-删除文章失败
- python查找指定字符所在行号_在python中获取当前位置所在的行号和函数名
- ubuntu16.04安装zabbix-server3.4
- AngularJS-compareDirective.js 验证指令
- turtle fillcolor_python3的turtle画模仿3d星空、运动的恒星小宇宙
- 正确理解springboot的常用注入方式
- SAM4E单片机之旅——4、LED闪烁之PWM
- 服务机器人分类包括哪些?
- (一)生成器详解——简单生成器
- 利用SVG滤镜实现水波倒影效果
- FZU - 2301 H - Chosen by god (组合数学)
- GAN生成对抗网络合集(七):cycleGAN—循环损失的提出 / starGAN
- fdisk - l报错:fdisk: /home/mengs/anaconda3/lib/libtinfo.so.6: no version information available (requir
热门文章
- 计算机乘法原理 移位,原码乘法,原码乘法原理详解
- 矩阵分析:广义逆矩阵,{1}逆,MP逆,D逆
- 基于vue2编写的md编辑器-Bytemd
- CSS 3之文字样式
- 【VulnHub靶场】——CFS三层靶机内网渗透实操
- 云主机装黑果实践(5):重得到镜像和继续强化前置启动过程
- Data Catalog3.0:Modern Metadata for the Modern Data Stack
- ASP.NET 上传图片添加文字、Logo水印
- Ubuntu强制关机后无法启动
- zookeeper关闭默认管理端口admin.serverPort=8080