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 08 Python
Python写的英文字符大小写转换代码示例
Mar 06 Python
Python使用pygame模块编写俄罗斯方块游戏的代码实例
Dec 08 Python
matplotlib绘制符合论文要求的图片实例(必看篇)
Jun 02 Python
python基于twisted框架编写简单聊天室
Jan 02 Python
python实现多层感知器
Jan 18 Python
python简单区块链模拟详解
Jul 03 Python
python实现发送form-data数据的方法详解
Sep 27 Python
Python3实现发送邮件和发送短信验证码功能
Jan 07 Python
pytorch实现mnist分类的示例讲解
Jan 10 Python
Tensorflow实现多GPU并行方式
Feb 03 Python
Python离线安装各种库及pip的方法
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
php.ini 配置文件的深入解析
2013/06/17 PHP
php中把美国时间转为北京时间的自定义函数分享
2014/07/28 PHP
PHP之uniqid()函数用法
2014/11/03 PHP
PHP 读取文本文件内容并分页显示
2016/01/02 PHP
php生成二维码不保存服务器还有下载功能的实现代码
2018/08/09 PHP
JS 巧妙获取剪贴板数据 Excel数据的粘贴
2009/07/09 Javascript
取得元素的左和上偏移量的方法
2014/09/17 Javascript
基于JavaScript实现瀑布流布局(二)
2016/01/26 Javascript
原生js制作日历控件实例分享
2016/04/06 Javascript
详解Vue.js——60分钟组件快速入门(上篇)
2016/12/05 Javascript
作为老司机使用 React 总结的 11 个经验教训
2017/04/08 Javascript
jQuery 1.9版本以上的浏览器判断方法代码分享
2017/08/28 jQuery
基于复选框demo(分享)
2017/09/27 Javascript
详解如何让Express支持async/await
2017/10/09 Javascript
vue单页面打包文件大?首次加载慢?nginx带你飞,从7.5M到1.3M蜕变过程(推荐)
2018/01/16 Javascript
jQuery实现文字超过1行、2行或规定的行数时自动加省略号的方法
2018/03/28 jQuery
Node.js中读取TXT文件内容fs.readFile()用法
2018/10/10 Javascript
Vuex实现数据共享的方法
2019/12/20 Javascript
[01:21]DOTA2新纪元-7.0新版本即将开启!
2016/12/11 DOTA
[01:59]翻天覆地,因你而变,7.20版本地图更新速览
2018/11/24 DOTA
[36:41]完美世界DOTA2联赛循环赛FTD vs Magma第一场 10月30日
2020/10/31 DOTA
小米5s微信跳一跳小程序python源码
2018/01/08 Python
python正向最大匹配分词和逆向最大匹配分词的实例
2018/11/14 Python
使用Python快速制作可视化报表的方法
2019/02/03 Python
Python tkinter 下拉日历控件代码
2020/03/04 Python
matplotlib 曲线图 和 折线图 plt.plot()实例
2020/04/17 Python
Python实现京东抢秒杀功能
2021/01/25 Python
解决margin 外边距合并问题
2019/07/03 HTML / CSS
推荐WEB开发者最佳HTML5和CSS3代码生成器
2015/11/24 HTML / CSS
我的网上商城创业计划书
2013/12/26 职场文书
“四风”查摆问题自我剖析材料
2014/09/27 职场文书
2014年爱国卫生工作总结
2014/11/22 职场文书
2014三年级班主任工作总结
2014/12/05 职场文书
中班上学期个人总结
2015/02/12 职场文书
基于angular实现树形二级表格
2021/10/16 Javascript
《我的美好婚事》动画化决定纪念插画与先导PV公开
2022/04/06 日漫