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的Cookie.py模块支持冒号做key的方法
Dec 28 Python
python中使用sys模板和logging模块获取行号和函数名的方法
Apr 15 Python
python实现的udp协议Server和Client代码实例
Jun 04 Python
Python调用C/C++动态链接库的方法详解
Jul 22 Python
python实现ipsec开权限实例
Nov 11 Python
python flask实现分页效果
Jun 27 Python
使用python读取txt文件的内容,并删除重复的行数方法
Apr 18 Python
Python 利用内置set函数对字符串和列表进行去重的方法
Jun 29 Python
解决py2exe打包后,总是多显示一个DOS黑色窗口的问题
Jun 21 Python
python实现人脸签到系统
Apr 13 Python
Pycharm github配置实现过程图解
Oct 13 Python
聊聊pytorch测试的时候为何要加上model.eval()
May 23 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实现邮件群发的源码
2013/06/18 PHP
解决cPanel无法安装php5.2.17
2014/06/22 PHP
PHP处理Json字符串解码返回NULL的解决方法
2014/09/01 PHP
PHP改进计算字符串相似度的函数similar_text()、levenshtein()
2014/10/27 PHP
thinkphp视图模型查询提示ERR: 1146:Table 'db.pr_order_view' doesn't exist的解决方法
2014/10/30 PHP
PHP使用mysqldump命令导出数据库
2015/04/14 PHP
php实现网页端验证码功能
2017/07/11 PHP
php实现的PDO异常处理操作分析
2018/12/27 PHP
JavaScript 学习笔记(十四) 正则表达式
2010/01/22 Javascript
ExtJs扩展之GroupPropertyGrid代码
2010/03/05 Javascript
Extjs TimeField 显示正常时间格式的代码
2011/06/28 Javascript
IE8提示Invalid procedure call or argument 异常的解决方法
2012/09/30 Javascript
js 点击页面其他地方关闭弹出层(示例代码)
2013/12/24 Javascript
JavaScript的null和undefined区别示例介绍
2014/09/15 Javascript
基于jquery css3实现点击动画弹出表单源码特效
2015/08/31 Javascript
jQuery日历插件datepicker用法详解
2016/03/03 Javascript
js基础之DOM中document对象的常用属性方法详解
2016/10/28 Javascript
vue按需引入element Transfer 穿梭框
2017/09/30 Javascript
JS简单实现动态添加HTML标记的方法示例
2018/04/08 Javascript
mock.js模拟数据实现前后端分离
2019/07/24 Javascript
AngularJs的$http发送POST请求,php无法接收Post的数据问题及解决方案
2020/08/13 Javascript
python实现识别相似图片小结
2016/02/22 Python
Python实现破解猜数游戏算法示例
2017/09/25 Python
python实现微信发送邮件关闭电脑功能
2018/02/22 Python
浅谈利用numpy对矩阵进行归一化处理的方法
2018/07/11 Python
python hough变换检测直线的实现方法
2019/07/12 Python
Python 实现取多维数组第n维的前几位
2019/11/26 Python
pytorch实现特殊的Module--Sqeuential三种写法
2020/01/15 Python
通过Canvas及File API缩放并上传图片完整示例
2013/08/08 HTML / CSS
HTML5 embed标签定义和用法详解
2014/05/09 HTML / CSS
测控技术与仪器个人求职信范文
2013/12/30 职场文书
班级标语大全
2014/06/21 职场文书
副校长竞聘演讲稿
2014/09/01 职场文书
优秀大学生申请书
2019/06/24 职场文书
Oracle创建只读账号的详细步骤
2021/06/07 Oracle
基于Python实现流星雨效果的绘制
2022/03/18 Python