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进程管理工具supervisor使用实例
Sep 17 Python
在Django中编写模版节点及注册标签的方法
Jul 20 Python
Python正则获取、过滤或者替换HTML标签的方法
Jan 28 Python
python 统计代码行数简单实例
May 04 Python
利用Celery实现Django博客PV统计功能详解
May 08 Python
一篇文章弄懂Python中所有数组数据类型
Jun 23 Python
python中pygame安装过程(超级详细)
Aug 04 Python
Python字节单位转换实例
Dec 05 Python
使用Keras画神经网络准确性图教程
Jun 15 Python
解决Keyerror ''acc'' KeyError: ''val_acc''问题
Jun 18 Python
Keras模型转成tensorflow的.pb操作
Jul 06 Python
python 实现压缩和解压缩的示例
Sep 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 缓存函数代码
2008/08/27 PHP
ThinkPHP3.0略缩图不能保存到子目录的解决方法
2012/09/30 PHP
php定义数组和使用示例(php数组的定义方法)
2014/03/29 PHP
PH P5.2至5.5、5.6的新增功能详解
2014/07/14 PHP
PHP耦合设计模式实例分析
2018/08/08 PHP
laravel 验证错误信息到 blade模板的方法
2019/09/29 PHP
php 的多进程操作实践案例分析
2020/02/28 PHP
FCK调用方法..
2006/12/21 Javascript
javascript中数组的冒泡排序使用示例
2013/12/18 Javascript
Bootstrap学习笔记之js组件(4)
2016/06/12 Javascript
JavaScript Ajax编程 应用篇
2016/07/02 Javascript
js document.getElementsByClassName的使用介绍与自定义函数
2016/11/25 Javascript
Angular2+如何去除url中的#号详解
2017/12/20 Javascript
解决vue中修改export default中脚本报一大堆错的问题
2018/08/27 Javascript
浅谈Angular 观察者模式理解
2018/11/01 Javascript
jQuery内容过滤选择器与子元素过滤选择器用法实例分析
2019/02/20 jQuery
微信小程序动态显示项目倒计时
2019/06/20 Javascript
Laravel 如何在blade文件中使用Vue组件的示例代码
2020/06/28 Javascript
原生js canvas实现鼠标跟随效果
2020/08/02 Javascript
[55:44]完美世界DOTA2联赛决赛 FTD vs Phoenix 第二场 11.08
2020/11/11 DOTA
python中list常用操作实例详解
2015/06/03 Python
教你用 Python 实现微信跳一跳(Mac+iOS版)
2018/01/04 Python
配置 Pycharm 默认 Test runner 的图文教程
2018/11/30 Python
Python微信操控itchat的方法
2019/05/31 Python
python实现证件照换底功能
2019/08/20 Python
python web框架中实现原生分页
2019/09/08 Python
Python操作qml对象过程详解
2019/09/26 Python
Window10下python3.7 安装与卸载教程图解
2019/09/30 Python
Python列表解析操作实例总结
2020/02/26 Python
Python3 io文本及原始流I/O工具用法详解
2020/03/23 Python
国际性能运动服装品牌:Dare 2b
2018/07/27 全球购物
Lookfantastic澳大利亚官网:英国知名美妆购物网站
2021/01/07 全球购物
电气工程师岗位职责
2014/01/01 职场文书
财务统计员岗位职责
2015/04/14 职场文书
导游词之镇江焦山
2019/11/21 职场文书
mysql 8.0.24 安装配置方法图文教程
2021/05/12 MySQL