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自动生成文章
Dec 25 Python
Python多进程multiprocessing用法实例分析
Aug 18 Python
python3利用smtplib通过qq邮箱发送邮件方法示例
Dec 03 Python
Python2包含中文报错的解决方法
Jul 09 Python
Python BS4库的安装与使用详解
Aug 08 Python
python中多个装饰器的调用顺序详解
Jul 16 Python
在Python中字符串、列表、元组、字典之间的相互转换
Nov 15 Python
Python实现直播推流效果
Nov 26 Python
pytorch动态网络以及权重共享实例
Jan 06 Python
Python大批量搜索引擎图像爬虫工具详解
Nov 16 Python
Python办公自动化之Excel(中)
May 24 Python
python b站视频下载的五种版本
May 27 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 Mssql操作简单封装支持存储过程
2009/12/11 PHP
PHP 创建文件(文件夹)以及目录操作代码
2010/03/04 PHP
PHP+Ajax异步带进度条上传文件实例
2016/11/01 PHP
JQuery 构建客户/服务分离的链接模型中Table分页代码效率初探
2010/01/22 Javascript
javascript 定义新对象方法
2010/02/20 Javascript
javascript hasFocus使用实例
2010/06/29 Javascript
基于jquery的横向滚动条(滑动条)
2011/02/24 Javascript
js页面滚动时层智能浮动定位实现(jQuery/MooTools)
2011/08/23 Javascript
javascript中interval与setTimeOut的区别示例介绍
2014/03/14 Javascript
jquery常用函数与方法汇总
2015/09/01 Javascript
angularjs 实现带查找筛选功能的select下拉框实例
2017/01/11 Javascript
Javascript自定义事件详解
2017/01/13 Javascript
微信小程序picker组件下拉框选择input输入框的实例
2017/09/20 Javascript
原生js封装添加class,删除class的实例
2017/11/06 Javascript
Angular之toDoList的实现代码示例
2017/12/02 Javascript
微信小程序基于本地缓存实现点赞功能的方法
2017/12/18 Javascript
jquery引入外部CDN 加载失败则引入本地jq库
2018/05/23 jQuery
Python中使用HTMLParser解析html实例
2015/02/08 Python
使用IronPython把Python脚本集成到.NET程序中的教程
2015/03/31 Python
Python通过paramiko远程下载Linux服务器上的文件实例
2018/12/27 Python
使用 Python 玩转 GitHub 的贡献板(推荐)
2019/04/04 Python
python使用正则来处理各种匹配问题
2019/12/22 Python
python enumerate内置函数用法总结
2020/01/07 Python
From CSV to SQLite3 by python 导入csv到sqlite实例
2020/02/14 Python
10个python爬虫入门实例(小结)
2020/11/01 Python
CSS3 实现footer 固定在底部(无论页面多高始终在底部)
2019/10/15 HTML / CSS
俄罗斯名牌服装网上商店:UNIQUE FABRIC
2019/07/25 全球购物
建筑毕业生自我鉴定
2013/10/18 职场文书
优秀班主任经验交流材料
2014/06/02 职场文书
环保标语大全
2014/06/12 职场文书
甜品店创业计划书
2014/08/14 职场文书
2015年学校关工委工作总结
2015/04/03 职场文书
学术会议通知
2015/04/15 职场文书
初中数学课堂教学反思
2016/02/17 职场文书
八年级作文之一起的走过日子
2019/09/17 职场文书
《中国机长》观后感:敬畏生命,敬畏职责
2019/11/12 职场文书