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生成器实现微线程编程的教程
Apr 13 Python
Python使用metaclass实现Singleton模式的方法
May 05 Python
python中文编码与json中文输出问题详解
Aug 24 Python
python实现电子产品商店
Feb 26 Python
Python3实现的判断回文链表算法示例
Mar 08 Python
Python交互式图形编程的实现
Jul 25 Python
Python使用get_text()方法从大段html中提取文本的实例
Aug 27 Python
Python datetime包函数简单介绍
Aug 28 Python
python实现提取COCO,VOC数据集中特定的类
Mar 10 Python
Selenium 安装和简单使用的实现
Dec 04 Python
Python进阶学习之带你探寻Python类的鼻祖-元类
May 08 Python
python批量创建变量并赋值操作
Jun 03 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学习之字符串比较和查找
2011/04/17 PHP
PHP仿博客园 个人博客(1) 数据库与界面设计
2013/07/05 PHP
php获取ajax的headers方法与内容实例
2017/12/27 PHP
php微信公众号开发之二级菜单
2018/10/20 PHP
解决IE下select标签innerHTML插入option的BUG(兼容IE,FF,Opera,Chrome,Safari)
2010/05/13 Javascript
JavaScript Function函数类型介绍
2015/04/08 Javascript
jQuery插件ajaxFileUpload使用实例解析
2016/10/19 Javascript
获取当前月(季度/年)的最后一天(set相关操作及应用)
2016/12/27 Javascript
JS实现京东首页之页面顶部、Logo和搜索框功能
2017/01/12 Javascript
js实现功能比较全面的全选和多选
2017/03/02 Javascript
深入理解Vue transition源码分析
2017/07/30 Javascript
JS中跳出循环的示例代码
2017/09/14 Javascript
js实现数组内数据的上移和下移的实例
2017/11/14 Javascript
webpack4.x开发环境配置详解
2018/08/04 Javascript
解决Vue使用swiper动态加载数据,动态轮播数据显示白屏的问题
2018/09/27 Javascript
js 将线性数据转为树形的示例代码
2019/05/28 Javascript
Element-UI+Vue模式使用总结
2020/01/02 Javascript
[05:03]显微镜下的DOTA2第十期——Ti3豪之超神幽鬼
2014/06/23 DOTA
[04:22]DOTA2上海特级锦标赛主赛事第四日TOP10
2016/03/06 DOTA
Python多线程扫描端口代码示例
2018/02/09 Python
Python 统计字数的思路详解
2018/05/08 Python
Pandas之ReIndex重新索引的实现
2019/06/25 Python
python学生信息管理系统实现代码
2019/12/17 Python
使用OpenCV circle函数图像上画圆的示例代码
2019/12/27 Python
python自动点赞功能的实现思路
2020/02/26 Python
详解python logging日志传输
2020/07/01 Python
浅析Python __name__ 是什么
2020/07/07 Python
html5声频audio和视频video等新特性详细说明
2012/12/26 HTML / CSS
广播电视新闻学专业应届生求职信
2013/10/08 职场文书
医学生临床实习自我评价
2014/03/07 职场文书
石油工程专业毕业生求职信
2014/04/13 职场文书
庆元旦活动总结
2014/07/09 职场文书
2014报到证办理个人委托书
2014/10/08 职场文书
2015年宣传部工作总结范文
2015/03/31 职场文书
《正比例》教学反思
2016/02/23 职场文书
民事调解协议书
2016/03/21 职场文书