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 相关文章推荐
Python3 操作符重载方法示例
Nov 23 Python
利用python3随机生成中文字符的实现方法
Nov 24 Python
Python 编码规范(Google Python Style Guide)
May 05 Python
python多行字符串拼接使用小括号的方法
Mar 19 Python
python里 super类的工作原理详解
Jun 19 Python
利用python-pypcap抓取带VLAN标签的数据包方法
Jul 23 Python
python 实现图片上传接口开发 并生成可以访问的图片url
Dec 18 Python
python 实现Flask中返回图片流给前端展示
Jan 09 Python
python实现字符串和数字拼接
Mar 02 Python
基于PyQT实现区分左键双击和单击
May 19 Python
使用python-cv2实现Harr+Adaboost人脸识别的示例
Oct 27 Python
python pygame入门教程
Jun 01 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中的正则表达式函数介绍
2012/02/27 PHP
基于node.js的快速开发透明代理
2010/12/25 Javascript
js 设置缓存及获取设置的缓存
2014/05/08 Javascript
js的image onload事件使用遇到的问题
2014/07/15 Javascript
CSS+JS实现点击文字弹出定时自动关闭DIV层菜单的方法
2015/05/12 Javascript
jQuery实现图片左右滚动特效
2020/04/20 Javascript
Javascript OOP之面向对象
2016/07/31 Javascript
理解 Node.js 事件驱动机制的原理
2017/08/16 Javascript
Javascript防止图片拉伸的自适应处理方法
2017/12/26 Javascript
vue 2.1.3 实时显示当前时间,每秒更新的方法
2018/09/16 Javascript
JS面试题大坑之隐式类型转换实例代码
2018/10/14 Javascript
解决vue自定义全局消息框组件问题
2019/11/22 Javascript
微信小程序实现点击按钮后修改颜色
2019/12/05 Javascript
深入浅析vue全局环境变量和模式
2020/04/28 Javascript
原生js+canvas实现贪吃蛇效果
2020/08/02 Javascript
基于javascript的无缝滚动动画1
2020/08/07 Javascript
Nest.js 授权验证的方法示例
2021/02/22 Javascript
[06:16]DOTA2守卫传承者——职业选手谈心路历程
2015/02/26 DOTA
Django框架中处理URLconf中特定的URL的方法
2015/07/20 Python
python 编程之twisted详解及简单实例
2017/01/28 Python
Python 3.x 安装opencv+opencv_contrib的操作方法
2018/04/02 Python
如何实现Django Rest framework版本控制
2019/07/25 Python
详解Python time库的使用
2019/10/10 Python
python用quad、dblquad实现一维二维积分的实例详解
2019/11/20 Python
全网最全python库selenium自动化使用详细教程
2021/01/12 Python
Python+MySQL随机试卷及答案生成程序的示例代码
2021/02/01 Python
一个基于canvas的移动端图片编辑器的实现
2020/10/28 HTML / CSS
中国最大的团购网站:聚划算
2016/09/21 全球购物
印度购物网站:TATA CLiQ
2017/11/23 全球购物
北京银河万佳Java面试题
2012/03/21 面试题
动漫专业高职生职业生涯规划书
2014/02/15 职场文书
大学应届毕业生求职信
2014/05/24 职场文书
2014年共青团工作总结
2014/12/10 职场文书
先进工作者主要事迹材料
2015/11/03 职场文书
浅谈Golang 嵌套 interface 的赋值问题
2021/04/29 Golang
MySQL 数据恢复的多种方法汇总
2021/06/21 MySQL