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实现多线程下载文件的代码实例
Jun 01 Python
Python 爬虫学习笔记之正则表达式
Sep 21 Python
python Socket之客户端和服务端握手详解
Sep 18 Python
Python实现PS图像调整黑白效果示例
Jan 25 Python
Python tkinter label 更新方法
Oct 11 Python
详解Django-restframework 之频率源码分析
Feb 27 Python
pytorch 实现cross entropy损失函数计算方式
Jan 02 Python
Python matplotlib 绘制双Y轴曲线图的示例代码
Jun 12 Python
Python sklearn中的.fit与.predict的用法说明
Jun 28 Python
python用Tkinter做自己的中文代码编辑器
Sep 07 Python
python实现简单贪吃蛇游戏
Sep 29 Python
Python中的tkinter库简单案例详解
Jan 22 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基于base64解码图片与加密图片还原实例
2014/11/03 PHP
laravel容器延迟加载以及auth扩展详解
2015/03/02 PHP
php使用json-schema模块实现json校验示例
2019/09/28 PHP
javascript Onunload与Onbeforeunload使用小结
2009/12/31 Javascript
基于JavaScript 数据类型之Boolean类型分析介绍
2013/04/19 Javascript
Javascript 遮罩层和加载效果代码
2013/08/01 Javascript
php析构函数的具体用法小结
2014/03/11 Javascript
20分钟成功编写bootstrap响应式页面 就这么简单
2016/05/12 Javascript
Bootstrap Table使用整理(四)之工具栏
2017/06/09 Javascript
基于Koa(nodejs框架)对json文件进行增删改查的示例代码
2019/02/02 NodeJs
vue router带参数页面刷新或回退参数消失的解决方法
2019/02/27 Javascript
JQuery常见节点操作实例分析
2019/05/15 jQuery
js new Date()实例测试
2019/10/31 Javascript
Vue简单实现原理详解
2020/05/07 Javascript
Openlayers实现图形绘制
2020/09/28 Javascript
[53:21]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS LGD-CDEC
2014/05/22 DOTA
[00:52]DOTA2第二届亚洲邀请赛预选赛宣传片
2017/01/13 DOTA
pymongo实现多结果进行多列排序的方法
2015/05/16 Python
Python中的字典与成员运算符初步探究
2015/10/13 Python
在Python中pandas.DataFrame重置索引名称的实例
2018/11/06 Python
Django JWT Token RestfulAPI用户认证详解
2019/01/23 Python
python 获得任意路径下的文件及其根目录的方法
2019/02/16 Python
自定义实现 PyQt5 下拉复选框 ComboCheckBox的完整代码
2020/03/30 Python
详解python如何引用包package
2020/06/07 Python
selenium3.0+python之环境搭建的方法步骤
2021/02/01 Python
使用Python webdriver图书馆抢座自动预约的正确方法
2021/03/04 Python
成教毕业生自我鉴定
2013/10/23 职场文书
《长城和运河》教学反思
2014/04/14 职场文书
小学德育工作经验交流材料
2014/05/22 职场文书
幼儿教师求职信
2014/05/24 职场文书
个人存款证明书
2014/10/18 职场文书
党风廉政建设调研报告
2015/01/01 职场文书
幼儿园保育员随笔
2015/08/14 职场文书
CSS的class与id常用的命名规则
2021/05/18 HTML / CSS
总结Pyinstaller打包的高级用法
2021/06/28 Python
Ruby GDBM操作简介及数据存储原理
2022/04/19 Ruby