在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,也就是一个类的继承的优先级顺序 有两种方法:

  1. .__mro__
  2. .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相关推荐

  1. Python多继承mro示例

    Python多继承mro示例 以下是python方法解析顺序的示例,详细的解释见代码的注释部分. # 1 解释python mro的执行顺序,详见数字序号的顺序 class Base(object): ...

  2. python 多继承与super使用详解_继承中的MRO与super详解

    Python进阶-继承中的MRO与super 写在前面如非特别说明,下文均基于Python3 摘要 本文讲述Python继承关系中如何通过super()调用"父类"方法,super ...

  3. Python - 多继承与MRO

    (一)多继承 网上关于多继承.MRO和C3算法的讲解比较多,在此不再赘述. 我们可以利用类的__mro__ 属性或者 mro() 方法查看某个类的MRO列表(方法调用顺序).   (二)经典案例 当执 ...

  4. python中的MRO与多继承

    相关概念: MRO:Method Resolution Order,即方法解析顺序,是python中用于处理二义性问题的算法 二义性: python支持多继承,多继承的语言往往会遇到以下两类二义性的问 ...

  5. python基础 继承

    继承 继承指的是类与类之间的关系,是一种什么"是"什么的关系,继承的功能之一就是用来解决代码重用问题 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父 ...

  6. python面向对象继承_Python 面向对象 --- 继承

    目标 单继承 多继承 面向对象三大特性 1,封装 根据 职责 将 属性 和 方法 封装 到以抽象的 类 中 2,继承 实现代码的重用,相同的代码不需要重复的缩写 3,多态 不同的对象调用相同的方法,产 ...

  7. Python的继承多态

    Python的继承多态 文章目录 Python的继承多态 一.私有属性和私有方法 01. 应用场景及定义方式 02. 伪私有属性和私有方法 二.单例 01. 单例设计模式 单例设计模式的应用场景 02 ...

  8. python多继承顺序及分配,python多继承的查找顺序是什么?

    1.查找顺序 (1)本地优先,自己定义或重写的方法优先.本地没有的,按照继承列表,从左往右查找: (2)单调性,所有子类,也要满足查找顺序.也就是说 A 继承 B C,A 会先找 B 再找 C.但是在 ...

  9. Python 多继承

    1.多继承 概念 子类 可以拥有 多个父类,并且具有 所有父类的 属性 和 方法: 例如:孩子 会继承自己 父亲 和 母亲 的 特性: 语法 class 子类(父类1,父类2...)pass clas ...

最新文章

  1. liunx查看python的site-packages路径
  2. 阿里技术人的成长路径是什么?
  3. Android应用开发:网络编程-1
  4. MFC单文档程序加载web网站和html文件
  5. [label][转载][JavaSript]querySelectorAll 方法相比 getElementsBy 系列方法有什么区别?
  6. node运行swagger-editor
  7. mybatis连接oracle_Mybatis 系列 0:初恋Mybatis
  8. 前端学习(3071):vue+element今日头条管理-删除文章失败
  9. python查找指定字符所在行号_在python中获取当前位置所在的行号和函数名
  10. ubuntu16.04安装zabbix-server3.4
  11. AngularJS-compareDirective.js 验证指令
  12. turtle fillcolor_python3的turtle画模仿3d星空、运动的恒星小宇宙
  13. 正确理解springboot的常用注入方式
  14. SAM4E单片机之旅——4、LED闪烁之PWM
  15. 服务机器人分类包括哪些?
  16. (一)生成器详解——简单生成器
  17. 利用SVG滤镜实现水波倒影效果
  18. FZU - 2301 H - Chosen by god (组合数学)
  19. GAN生成对抗网络合集(七):cycleGAN—循环损失的提出 / starGAN
  20. fdisk - l报错:fdisk: /home/mengs/anaconda3/lib/libtinfo.so.6: no version information available (requir

热门文章

  1. 计算机乘法原理 移位,原码乘法,原码乘法原理详解
  2. 矩阵分析:广义逆矩阵,{1}逆,MP逆,D逆
  3. 基于vue2编写的md编辑器-Bytemd
  4. CSS 3之文字样式
  5. 【VulnHub靶场】——CFS三层靶机内网渗透实操
  6. 云主机装黑果实践(5):重得到镜像和继续强化前置启动过程
  7. Data Catalog3.0:Modern Metadata for the Modern Data Stack
  8. ASP.NET 上传图片添加文字、Logo水印
  9. Ubuntu强制关机后无法启动
  10. zookeeper关闭默认管理端口admin.serverPort=8080