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列表操作实例
Jan 14 Python
Windows下PyMongo下载及安装教程
Apr 27 Python
python与sqlite3实现解密chrome cookie实例代码
Jan 20 Python
分析python请求数据
Aug 19 Python
Python设计模式之状态模式原理与用法详解
Jan 15 Python
详解python运行三种方式
May 13 Python
python print出共轭复数的方法详解
Jun 25 Python
pandas DataFrame的修改方法(值、列、索引)
Aug 02 Python
用python解压分析jar包实例
Jan 16 Python
Keras—embedding嵌入层的用法详解
Jun 10 Python
解决运行出现'dict' object has no attribute 'has_key'问题
Jul 15 Python
pycharm无法导入lxml的解决办法
Mar 31 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
用mysql触发器自动更新memcache的实现代码
2009/10/11 PHP
php SQL Injection with MySQL
2011/02/27 PHP
基于php缓存的详解
2013/05/15 PHP
如何把php5.3版本升级到php5.4或者php5.5
2015/07/31 PHP
全面解读PHP的人气开发框架Laravel
2015/10/15 PHP
php  PATH_SEPARATOR判断当前服务器系统类型实例
2016/10/28 PHP
prototype 的说明 js类
2006/09/07 Javascript
javascript document.execCommand() 常用解析
2009/12/14 Javascript
基于jQuery实现表格数据的动态添加与统计的代码
2011/01/31 Javascript
屏蔽网页右键复制和ctrl+c复制的js代码
2013/01/04 Javascript
基于node.js之调试器详解
2017/08/22 Javascript
vue如何引入sass全局变量
2018/06/28 Javascript
vue使用localStorage保存登录信息 适用于移动端、PC端
2019/05/27 Javascript
[42:24]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第三场 11.27
2020/12/01 DOTA
Python判断操作系统类型代码分享
2014/11/22 Python
python中的闭包用法实例详解
2015/05/05 Python
Python 在字符串中加入变量的实例讲解
2018/05/02 Python
Python+PyQt5实现美剧爬虫可视工具的方法
2019/04/25 Python
python中pip的使用和修改下载源的方法
2019/07/08 Python
opencv实现简单人脸识别
2021/02/19 Python
如何将anaconda安装配置的mmdetection环境离线拷贝到另一台电脑
2020/10/15 Python
pytorch简介
2020/11/11 Python
加拿大奢华时装品牌:Mackage
2018/01/10 全球购物
英国领先的大码时装品牌之一:Elvi
2018/08/26 全球购物
阿联酋优惠券服务:Living Kool
2019/12/12 全球购物
结构工程研究生求职信
2013/10/13 职场文书
学校岗位设置方案
2014/01/16 职场文书
《世界多美呀》教学反思
2014/03/02 职场文书
建筑工程质量通病防治方案
2014/06/08 职场文书
法制宣传口号
2014/06/16 职场文书
债务纠纷委托书范本
2014/10/14 职场文书
机关作风建设自查报告及整改措施
2014/10/21 职场文书
英语辞职信范文
2015/02/28 职场文书
高一化学教学反思
2016/02/22 职场文书
Django程序的优化技巧
2021/04/29 Python
Python干货实战之八音符酱小游戏全过程详解
2021/10/24 Python