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的Flask框架来构建一个简单的数字商品支付解决方案
Mar 31 Python
使用IPython来操作Docker容器的入门指引
Apr 08 Python
python 快速把超大txt文件转存为csv的实例
Oct 26 Python
深度辨析Python的eval()与exec()的方法
Mar 26 Python
python pillow模块使用方法详解
Aug 30 Python
手机使用python操作图片文件(pydroid3)过程详解
Sep 25 Python
Python with语句和过程抽取思想
Dec 23 Python
Tensorflow读取并输出已保存模型的权重数值方式
Jan 04 Python
Matplotlib绘制雷达图和三维图的示例代码
Jan 07 Python
使用python实现时间序列白噪声检验方式
Jun 03 Python
plt.figure()参数使用详解及运行演示
Jan 08 Python
利用python做表格数据处理
Apr 13 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一些有意思的小区别
2006/12/06 PHP
PHP Global定义全局变量使用说明
2013/08/15 PHP
基于PHP技术开发客服工单系统
2016/01/06 PHP
数组任意位置插入元素,删除特定元素的实例
2017/03/02 PHP
使用composer命令加载vendor中的第三方类库 的方法
2019/07/09 PHP
PHP 实现缩略图
2021/03/09 PHP
Textarea与懒惰渲染实现代码
2012/01/04 Javascript
jquery load事件(callback/data)使用方法及注意事项
2013/02/06 Javascript
jquery触发a标签跳转事件示例代码
2013/07/21 Javascript
jquery设置元素的readonly和disabled的写法
2013/09/22 Javascript
jquery datepicker参数介绍和示例
2014/04/15 Javascript
javascript实现对表格元素进行排序操作
2015/11/18 Javascript
JavaScript基础知识点归纳(推荐)
2016/07/09 Javascript
js转换对象为xml
2017/02/17 Javascript
微信小程序数字滚动插件使用详解
2018/02/02 Javascript
JavaScript实现简单的文本逐字打印效果示例
2018/04/12 Javascript
Vue实现双向绑定的原理以及响应式数据的方法
2018/07/02 Javascript
Vue唯一可以更改vuex实例中state数据状态的属性对象Mutation的讲解
2019/01/18 Javascript
Python socket编程实例详解
2015/05/27 Python
python监控键盘输入实例代码
2018/02/09 Python
python ChainMap的使用和说明详解
2019/06/11 Python
PyQt5 在label显示的图片中绘制矩形的方法
2019/06/17 Python
django-rest-framework 自定义swagger过程详解
2019/07/18 Python
Python3如何对urllib和urllib2进行重构
2019/11/25 Python
使用keras时input_shape的维度表示问题说明
2020/06/29 Python
中国电视购物:快乐购
2017/02/04 全球购物
周仰杰(JIMMY CHOO)英国官方网站:闻名世界的鞋子品牌
2018/10/28 全球购物
介绍一下HDLC(High-Level Data Link Control)高层数据链路协议
2012/01/21 面试题
简述进程的启动、终止的方式以及如何进行进程的查看
2013/07/12 面试题
竞争上岗演讲稿
2014/01/05 职场文书
工程招投标邀请书
2014/01/30 职场文书
个人安全承诺书
2014/05/22 职场文书
公司行政专员岗位职责
2014/08/24 职场文书
九一八事变纪念日演讲稿
2014/09/14 职场文书
2015年银行信贷员工作总结
2015/05/19 职场文书
上手简单,功能强大的Python爬虫框架——feapder
2021/04/27 Python