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中查找excel某一列的重复数据 剔除之后打印
Feb 10 Python
跟老齐学Python之编写类之四再论继承
Oct 11 Python
Python中利用函数装饰器实现备忘功能
Mar 30 Python
python输出当前目录下index.html文件路径的方法
Apr 28 Python
python win32 简单操作方法
May 25 Python
Python使用回溯法子集树模板获取最长公共子序列(LCS)的方法
Sep 08 Python
Python+matplotlib+numpy绘制精美的条形统计图
Jan 02 Python
python数字图像处理之高级形态学处理
Apr 27 Python
Python中的pathlib.Path为什么不继承str详解
Jun 23 Python
Pycharm中安装Pygal并使用Pygal模拟掷骰子(推荐)
Apr 08 Python
Python使用grequests并发发送请求的示例
Nov 05 Python
python+selenium实现12306模拟登录的步骤
Jan 21 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
全国FM电台频率大全 - 1 北京市
2020/03/11 无线电
overlord人气高涨,却被菲利普频繁举报,第四季很难在国内上映
2020/05/06 日漫
咖啡知识 除了喝咖啡还有那些知识点
2021/03/06 新手入门
Email+URL的判断和自动转换函数
2006/10/09 PHP
php Undefined index和Undefined variable的解决方法
2008/03/27 PHP
深入php define()函数以及defined()函数的用法详解
2013/06/05 PHP
php+ajax实现图片文件上传功能实例
2014/06/17 PHP
中高级PHP程序员应该掌握哪些技术?
2016/09/23 PHP
PHP的简单跳转提示的实现详解
2019/03/14 PHP
thinkphp诸多限制条件下如何getshell详解
2020/12/09 PHP
在textarea中屏蔽js的某个function的javascript代码
2007/04/20 Javascript
javascript:void(0)点击登录没反应怎么解决
2015/11/13 Javascript
jQuery实现鼠标双击Table单元格变成文本框及输入内容后更新到数据库的方法
2015/11/25 Javascript
Angularjs中UI Router的使用方法
2016/05/14 Javascript
Bootstrap警告框(Alert)插件使用方法
2017/03/21 Javascript
MUI 上拉刷新/下拉加载功能实例代码
2017/04/13 Javascript
vue组件父子间通信之综合练习(聊天室)
2017/11/07 Javascript
js删除数组中某几项的方法总结
2019/01/16 Javascript
微信小程序封装多张图片上传api代码实例
2019/12/30 Javascript
js实现自定义右键菜单
2020/05/18 Javascript
vue解决跨域问题(推荐)
2020/11/10 Javascript
Python转码问题的解决方法
2008/10/07 Python
python绘制铅球的运行轨迹代码分享
2017/11/14 Python
Python中的枚举类型示例介绍
2019/01/09 Python
Python实现画图软件功能方法详解
2020/07/28 Python
Django中和时区相关的安全问题详解
2020/10/12 Python
诺心蛋糕官网:LE CAKE
2018/08/25 全球购物
会计系个人求职信范文分享
2013/12/20 职场文书
中华在我心中演讲稿
2014/09/13 职场文书
在职证明书范本(2014新版)
2014/09/25 职场文书
母亲节寄语大全
2015/02/27 职场文书
党小组评议意见
2015/06/02 职场文书
朋友离别感言
2015/08/04 职场文书
vue实现无缝轮播效果(跑马灯)
2021/05/14 Vue.js
python实现MD5进行文件去重的示例代码
2021/07/09 Python
win11无线投屏在哪设置? win11无线投屏功能的使用方法
2022/04/08 数码科技