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复制文件代码实现
Dec 23 Python
Django中更新多个对象数据与删除对象的方法
Jul 17 Python
Python实现约瑟夫环问题的方法
May 03 Python
python编程实现归并排序
Apr 14 Python
Django数据库表反向生成实例解析
Feb 06 Python
django 在原有表格添加或删除字段的实例
May 27 Python
python编程使用协程并发的优缺点
Sep 20 Python
python判断列表的连续数字范围并分块的方法
Nov 16 Python
详解python 降级到3.6终极解决方案
Feb 06 Python
Python创建空列表的字典2种方法详解
Feb 13 Python
Python制作一个仿QQ办公版的图形登录界面
Sep 22 Python
Pycharm中使用git进行合作开发的教程详解
Nov 17 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
当年上海收录机产品生产,进口和价格情况
2021/03/04 无线电
分割GBK中文遭遇乱码的解决方法
2013/08/09 PHP
php+js实现图片的上传、裁剪、预览、提交示例
2013/08/27 PHP
php使用gettimeofday函数返回当前时间并存放在关联数组里
2015/03/19 PHP
thinkPHP自定义类实现方法详解
2016/11/30 PHP
thinkPHP+mysql+ajax实现的仿百度一下即时搜索效果详解
2019/07/15 PHP
prototype 中文参数乱码解决方案
2009/11/09 Javascript
JS在IE和FF下attachEvent,addEventListener学习笔记
2009/11/26 Javascript
js事件冒泡实例分享(已测试)
2013/04/23 Javascript
javascript陷阱 一不小心你就中招了(字符运算)
2013/11/10 Javascript
jquery实现select下拉框美化特效代码分享
2015/08/18 Javascript
深入理解jQuery layui分页控件的使用
2016/08/17 Javascript
详解bootstrap的modal-remote两种加载方式【强化】
2017/01/27 Javascript
使用原生js写ajax实例(推荐)
2017/05/31 Javascript
D3.js进阶系列之CSV表格文件的读取详解
2017/06/06 Javascript
JS随机数产生代码分享
2018/02/24 Javascript
详解Vue 全局引入bass.scss 处理方案
2018/03/26 Javascript
使用JS实现导航切换时高亮显示的示例讲解
2018/08/22 Javascript
vue单页面应用打开新窗口显示跳转页面的实例
2018/09/21 Javascript
微信小程序结合mock.js实现后台模拟及调试
2019/03/28 Javascript
Javascript var变量删除原理及实现
2020/08/26 Javascript
vue自定义树状结构图的实现方法
2020/10/18 Javascript
Python函数返回值实例分析
2015/06/08 Python
python获取酷狗音乐top500的下载地址 MP3格式
2018/04/17 Python
python将处理好的图像保存到指定目录下的方法
2019/01/10 Python
python对象与json相互转换的方法
2019/05/07 Python
详解Django定时任务模块设计与实践
2019/07/24 Python
tensorflow中tf.reduce_mean函数的使用
2020/04/19 Python
机械制造与自动化应届生求职信
2013/11/16 职场文书
公司营业员的自我评价
2014/03/04 职场文书
《云房子》教学反思
2014/04/20 职场文书
好习惯伴我成长演讲稿
2014/05/21 职场文书
2015年音乐教师个人工作总结
2015/05/20 职场文书
遗愿清单观后感
2015/06/09 职场文书
Oracle设置DB、监听和EM开机启动的方法
2021/04/25 Oracle
Python Parser的用法
2021/05/12 Python