Python多重继承的方法解析执行顺序实例分析


Posted in Python onMay 26, 2018

本文实例讲述了Python多重继承的方法解析执行顺序。分享给大家供大家参考,具体如下:

任何实现多重继承的语言都要处理潜在的命名冲突, 这种冲突由不相关的祖先类实现同名方法引起

Python多重继承的方法解析执行顺序实例分析

class A:
  def say(self):
    print("A Hello:", self)
class B(A):
  def eat(self):
    print("B Eating:", self)
class C(A):
  def eat(self):
    print("C Eating:", self)
class D(B, C):
  def say(self):
    super().say()
    print("D Hello:", self)
  def dinner(self):
    self.say()
    super().say()
    self.eat()
    super().eat()
    C.eat(self)

这里B和C都实现了eat方法,

在 D 的实例上调用 d.eat() 方法的话, 运行的是哪个 eat 方法呢?

>>> d = D()
>>> d.eat()
B Eating: <__main__.D object at 0x7fb90c627f60>
>>> C.eat(d)
C Eating: <__main__.D object at 0x7fb90c627f60>

超类中的方法都可以直接调用, 此时要把实例作为显式参数传入

Python 能区分 d.eat() 调用的是哪个方法, 是因为 Python 会按照特定的顺序遍历继承图。 这个顺序叫方法解析顺序( Method Resolution Order, MRO)。 类都有一个名为 __mro__ 的属性, 它的值是一个元组, 按照方法解析顺序列出各个超类, 从当前类一直向上, 直到object 类。 D 类的 __mro__ 属性如下 :

>>> D.__mro__
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class 'object'>)
>>> d = D()
>>> d.dinner()
A Hello: <__main__.D object at 0x7fb90bd7eb70>
D Hello: <__main__.D object at 0x7fb90bd7eb70>
A Hello: <__main__.D object at 0x7fb90bd7eb70>
B Eating: <__main__.D object at 0x7fb90bd7eb70>
B Eating: <__main__.D object at 0x7fb90bd7eb70>
C Eating: <__main__.D object at 0x7fb90bd7eb70>

第一个self.say(),运行A类的say()再print出自己的第二行信息
第二个super().say(),运行A类的say()
第三个self.eat(),根据 __mro__ , 找到的是 B 类实现的eat方法
第四个super().eat(),根据 __mro__ , 找到的是 B 类实现的eat方法
第五个C.eat(self)忽略 mro , 找到的是 C 类实现的eat方法

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
利用Python脚本在Nginx和uwsgi上部署MoinMoin的教程
May 05 Python
解决Python 遍历字典时删除元素报异常的问题
Sep 11 Python
python编程使用协程并发的优缺点
Sep 20 Python
Python 中 function(#) (X)格式 和 (#)在Python3.*中的注意事项
Nov 30 Python
Django实现学员管理系统
Feb 26 Python
Python从list类型、range()序列简单认识类(class)【可迭代】
May 31 Python
Django模型序列化返回自然主键值示例代码
Jun 12 Python
解决python中导入win32com.client出错的问题
Jul 26 Python
Django中使用session保持用户登陆连接的例子
Aug 06 Python
python 图像的离散傅立叶变换实例
Jan 02 Python
python+opencv3生成一个自定义纯色图教程
Feb 19 Python
解决keras backend 越跑越慢问题
Jun 18 Python
Python多继承顺序实例分析
May 26 #Python
Python装饰器用法实例总结
May 26 #Python
python 脚本生成随机 字母 + 数字密码功能
May 26 #Python
Python高级用法总结
May 26 #Python
关于Python的一些学习总结
May 25 #Python
windows下python和pip安装教程
May 25 #Python
python2.7实现爬虫网页数据
May 25 #Python
You might like
一些常用的php简单命令代码集锦
2007/09/24 PHP
PHP中图片等比缩放的实例
2013/03/24 PHP
php实现的获取网站备案信息查询代码(360)
2013/09/23 PHP
PHP入门经历和学习过程分享
2014/04/11 PHP
yii2整合百度编辑器umeditor及umeditor图片上传问题的解决办法
2016/04/20 PHP
PHP读取CSV大文件导入数据库的实例
2017/07/24 PHP
如果文字过长,则将过长的部分变成省略号显示
2006/06/26 Javascript
javascript面向对象包装类Class封装类库剖析
2013/01/24 Javascript
禁止选中文字兼容IE、Chrome、FF等
2013/09/04 Javascript
jQuery中eq()方法用法实例
2015/01/05 Javascript
jQuery实现contains方法不区分大小写的方法
2015/02/13 Javascript
JavaScript实现将UPC转换成ISBN的方法
2015/05/26 Javascript
全面解析Bootstrap中tooltip、popover的使用方法
2016/06/13 Javascript
AngularJS下对数组的对比分析
2016/08/24 Javascript
jQuery简易时光轴实现方法示例
2017/03/13 Javascript
JS实现线性表的顺序表示方法示例【经典数据结构】
2017/04/11 Javascript
简单实现jQuery手风琴效果
2017/08/18 jQuery
前端开发不得不知的10个最佳ES6特性
2017/08/30 Javascript
vue2.0s中eventBus实现兄弟组件通信的示例代码
2017/10/25 Javascript
详解jQuery获取特殊属性的值以及设置内容
2018/11/14 jQuery
es6数组includes()用法实例分析
2020/04/18 Javascript
js实现右键弹出自定义菜单
2020/09/08 Javascript
vue实现lodop打印功能的示例
2020/11/11 Javascript
[01:09:10]NB vs Liquid Supermajor小组赛 A组胜者组决赛 BO3 第一场 6.2
2018/06/04 DOTA
python tkinter canvas使用实例
2019/11/04 Python
Transpose 数组行列转置的限制方式
2020/02/11 Python
django修改models重建数据库的操作
2020/03/31 Python
总结Pyinstaller的坑及终极解决方法(小结)
2020/09/21 Python
Jupyter安装拓展nbextensions及解决官网下载慢的问题
2021/03/03 Python
html5开发三八女王节表白神器
2018/03/07 HTML / CSS
Html5饼图绘制实现统计图的方法
2020/08/05 HTML / CSS
美国女性奢华品牌精品店:INTERMIX
2017/10/12 全球购物
菲律宾优惠券网站:MetroDeal
2019/04/12 全球购物
办理居住证介绍信
2014/01/15 职场文书
贫困生助学金感谢信
2015/01/21 职场文书
楚门的世界观后感
2015/06/03 职场文书