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写入中英文字符串到文件的方法
May 06 Python
python发送邮件功能实现代码
Jul 15 Python
基于python批量处理dat文件及科学计算方法详解
May 08 Python
Python实现多级目录压缩与解压文件的方法
Sep 01 Python
将python图片转为二进制文本的实例
Jan 24 Python
Django 日志配置按日期滚动的方法
Jan 31 Python
学习python的前途 python挣钱
Feb 27 Python
Python 操作 ElasticSearch的完整代码
Aug 04 Python
Python 利用邮件系统完成远程控制电脑的实现(关机、重启等)
Nov 19 Python
python 图像的离散傅立叶变换实例
Jan 02 Python
Python小整数对象池和字符串intern实例解析
Mar 21 Python
Python基于Webhook实现github自动化部署
Nov 28 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
Smarty foreach控制循环次数的实现详解
2013/07/03 PHP
php实现的常见排序算法汇总
2014/09/08 PHP
提高代码性能技巧谈—以创建千行表格为例
2006/07/01 Javascript
jQuery UI Datepicker length为空或不是对象错误的解决方法
2010/12/19 Javascript
常见效果实现之返回顶部(结合淡入、淡出、减速滚动)
2012/01/04 Javascript
如何制作浮动广告 JavaScript制作浮动广告代码
2012/12/30 Javascript
jquery ajax同步异步的执行最终解决方案
2013/04/26 Javascript
兼容FF和IE的动态table示例自写
2013/10/21 Javascript
利用window.name实现windowStorage代码分享
2014/01/02 Javascript
jQuery实现的在线答题功能
2015/04/12 Javascript
jQuery采用连缀写法实现的折叠菜单效果
2015/09/18 Javascript
Javascript的无new构建实例详解
2016/05/15 Javascript
vue数字类型过滤器的示例代码
2017/09/07 Javascript
解决jquery appaend元素中id绑定事件失效的问题
2017/09/12 jQuery
利用vue开发一个所谓的数独方法实例
2017/12/21 Javascript
JsChart组件使用详解
2018/03/04 Javascript
基于iScroll实现内容滚动效果
2018/03/21 Javascript
vue中mint-ui的使用方法
2018/04/04 Javascript
vue移动端模态框(可传参)的实现
2019/11/20 Javascript
vue实现整屏滚动切换
2020/06/29 Javascript
vue2.0 watch里面的 deep和immediate用法说明
2020/10/30 Javascript
[02:20]DOTA2亚洲邀请赛 EHOME战队出场宣传片
2015/02/07 DOTA
Django中模型Model添加JSON类型字段的方法
2015/06/17 Python
Python使用django搭建web开发环境
2017/06/09 Python
PyQt5每天必学之拖放事件
2020/08/27 Python
python 调用有道api接口的方法
2019/01/03 Python
python覆盖写入,追加写入的实例
2019/06/26 Python
Python生成器实现简单&quot;生产者消费者&quot;模型代码实例
2020/03/27 Python
详解在Python中使用Torchmoji将文本转换为表情符号
2020/07/27 Python
使用HTML5 Canvas API中的clip()方法裁剪区域图像
2016/03/25 HTML / CSS
HTML5 新旧语法标记对我们有什么好处
2012/12/13 HTML / CSS
蒂芙尼澳大利亚官方网站:Tiffany&Co. Australia
2017/08/27 全球购物
Under Armour西班牙官网:美国知名的高端功能性运动品牌
2018/12/12 全球购物
群众路线党员个人剖析材料
2014/10/08 职场文书
爱护环境建议书
2015/09/14 职场文书
Docker下安装Oracle19c
2022/04/13 Servers