Python多重继承的方法解析执行顺序实例分析
作者:很长很长的名字 发布时间:2021-06-08 04:34:51
标签: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程序设计有所帮助。
来源:https://blog.csdn.net/u011019726/article/details/77712080


猜你喜欢
- 由于工作需要在一大堆日志里面提取相应的一些固定字符,如果单纯靠手工取提取,数据量大,劳心劳力,于是自然而然想到了用Python做一个对应的提
- 在matplotlib官网看到了第三方库numpngw的简介,利用该库作为插件可以辅助matplotlib生成png动画。numpngw概述
- 又仔细看了一遍vuex的文档,还是云里雾里的,不过至少明白它是一个专门管理状态的,根据数据状态的改变可以驱动视图更新,既然是这样那至少登录注
- ?图解redis通信协议请求协议:请求协议一般格式:*<参数数量> CR LF$<参数 1 的字节数量> CR LF
- :hover是我们在CSS设计中最常运用的伪类之一,许多绚丽效果的实现离不开伪类:hover,比如我们常见的纯CSS菜单、相册效果等等。或许
- 前言:我们先定义一个test01.py的文件。test01.py中代码如下所示:def step():print(__name__) &nb
- 关于php,最近学了好多,老师跟我们说,现在学的都是php的核心部分,所以我比较注意了一下,也多练习了几遍,相对来说理解起来嗨算轻松,没有刚
- 今天交流会上,分享前端的开发经验,有一条虽然很快带过,但是我倒是印象蛮深刻的,就写点小结来分享一下吧。不知道是标准害了大家还是大家害了标准,
- 保持良好的代码风格是每个Coder必学的课程,同样在HTML设计的时候也要特别注意代码的规范性,虽然说不规范的代码不会直接造成严重的后果,但
- 本文实例讲述了MySQL查看、创建和删除索引的方法。分享给大家供大家参考。具体如下:1.索引作用在索引列上,除了上面提到的有序查找之外,数据
- 解决python -v报错问题的方法:在cmd命令行中输入“python -v”报错是因为没有将python的安装路径添加到系统环境变量pa
- CSS的学习和其他的学习一样,都需要特定的方法才能比较快的去掌握它.要想掌握CSS, 首先要学会HTML,我刚开始是从零开始学习的
- 机器学习之随机森林,供大家参考,具体内容如下1、Bootstraping(自助法)  
- 为了配置基于 mod_python 的 Django,首先要安装有可用的 mod_python 模块的 Apache。 这通常意味着应该有一
- 前言在日常工作中,常常需要周期性地执行某些任务,常用的方式是采用 Linux 系统自带的 crond 结合命令行实现,但最近却遇到了一个让人
- 前言 使用scrapy进行大型爬取任务的时候(爬取耗时以天为单位),无论主机网速多好,爬完之后总会发现scrapy
- numpy打乱数组或打乱矩阵行使用numpy.random.shuffle函数,能够打乱ndarray对象的第一维度,对于数组来说,就是整体
- 问题描述大家都知道, MySQL 中按某字段升序排列的 SQL 为 (以 id 为例,下同):SELECT * FROM `MyTable`
- 用户体验已经是一个老生常谈的话题了。我非常赞同某位达人所说的,用户体验设计应该贯穿于产品从萌芽到出生的整个过程,产品原型、视觉设计、前端开发
- 我们都知道代码都是顺序执行的,也就是先执行第1条语句,然后是第2条、第3条……一直到最后一条语句