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实现的阳历转阴历(农历)算法
Apr 25 Python
在Python中利用Pandas库处理大数据的简单介绍
Apr 07 Python
使用Python设置tmpfs来加速项目的教程
Apr 17 Python
Python中实现三目运算的方法
Jun 21 Python
Django框架中数据的连锁查询和限制返回数据的方法
Jul 17 Python
Python实现嵌套列表及字典并按某一元素去重复功能示例
Nov 30 Python
python负载均衡的简单实现方法
Feb 04 Python
python执行系统命令后获取返回值的几种方式集合
May 12 Python
Python中将两个或多个list合成一个list的方法小结
May 12 Python
关于Django Models CharField 参数说明
Mar 31 Python
Python 日期时间datetime 加一天,减一天,加减一小时一分钟,加减一年
Apr 16 Python
python Protobuf定义消息类型知识点讲解
Mar 02 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全概率运算函数(优化版) Webgame开发必备
2011/07/04 PHP
php实现高效获取图片尺寸的方法
2014/12/12 PHP
基于jquery的一个OutlookBar类,动态创建导航条
2010/11/19 Javascript
jquery实现的可隐藏重现的靠边悬浮层实例代码
2013/05/27 Javascript
jquery sortable的拖动方法示例详解
2014/01/16 Javascript
跟我学习javascript的垃圾回收机制与内存管理
2015/11/23 Javascript
如何使用jquery修改css中带有!important的样式属性
2016/04/28 Javascript
BootStrap下拉框在firefox浏览器界面不友好的解决方案
2016/08/18 Javascript
浅谈jquery设置和获得checkbox选中的问题
2016/08/19 Javascript
微信小程序 MINA文件结构
2016/10/17 Javascript
JavaScript中Array对象用法实例总结
2016/11/29 Javascript
Map.vue基于百度地图组件重构笔记分享
2017/04/17 Javascript
Vue 实现树形视图数据功能
2018/05/07 Javascript
Python3基础之条件与循环控制实例解析
2014/08/13 Python
在Python中操作列表之List.append()方法的使用
2015/05/20 Python
Python3读取zip文件信息的方法
2015/05/22 Python
Python3读取文件常用方法实例分析
2015/05/22 Python
利用Python-iGraph如何绘制贴吧/微博的好友关系图详解
2017/11/02 Python
Python cookbook(数据结构与算法)同时对数据做转换和换算处理操作示例
2018/03/23 Python
Python中GeoJson和bokeh-1的使用讲解
2019/01/03 Python
pyqt5 获取显示器的分辨率的方法
2019/06/18 Python
Python 实现自动导入缺失的库
2019/10/29 Python
Python面向对象之多态原理与用法案例分析
2019/12/30 Python
浅谈python 中的 type(), dtype(), astype()的区别
2020/04/09 Python
python palywright库基本使用
2021/01/21 Python
CSS3 media queries + jQuery实现响应式导航
2016/09/30 HTML / CSS
浅析HTML5中的download属性使用
2019/03/13 HTML / CSS
英国在线房屋中介网站:Yopa
2018/01/09 全球购物
Electrolux伊莱克斯巴西商店:家用电器、小家电和配件
2018/05/23 全球购物
Linden Leaves官网:新西兰纯净护肤品
2020/12/20 全球购物
30年同学聚会邀请函
2014/01/25 职场文书
高中生物教学反思
2014/02/05 职场文书
大学生学期自我鉴定
2014/03/19 职场文书
班主任个人工作反思
2014/04/28 职场文书
质量承诺书格式
2014/05/20 职场文书
Java设计模式中的命令模式
2022/04/28 Java/Android