关于Python3中的super()函数

我们都知道,在Python3中子类在继承父类的时候,当子类中的方法与父类中的方法重名时,子类中的方法会覆盖父类中的方法,

那么,如果我们想实现同时调用父类和子类中的同名方法,就需要使用到super()这个函数,用法为super().函数名()

下面是一个例子:

class A1():
def go(self):
print("go A1 go") class A2():
def go(self):
print("go A2 go") class A3():
def go(self):
print("go A3 go") class C(A3):
pass class B(A1,A2):
pass class D(B,C):
def go(self):
print("NMSL")
super().go() d1 = D()
d1.go()
print(D.__mro__)

输出结果为:

NMSL
go A1 go
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.A1'>, <class '__main__.A2'>, <class '__main__.C'>, <class '__main__.A3'>, <class 'object'>)

这里的__mro__属性显示了当类调用方法时,如果父类和子类中有同名方法情况下的查找顺序。

如图,当我们实例化D类并调用类中的go方法时,go方法中有一条语句调用了父类的go方法,__mro__属性显示了如何查找这个方法(当然,自身类中的go方法不算),最后我们知道它调用的是A1类中的go方法,那么有些人会疑惑,为什么它不调用更近的的A3类或者A2类中go方法呢,这就要涉及到super()函数实现顺序查找的算法,这个算法即为C3算法。我的另一篇博客中记录了这个算法的原理。

假如D类中本身就没有go方法,那么我们再使用super()函数进行调用go方法,它会选择哪一个父类的呢?

代码如下:

class A1():
def go(self):
print("go A1 go") class A2():
def go(self):
print("go A2 go") class A3():
def go(self):
print("go A3 go") class C(A3):
pass class B(A1,A2):
pass class D(B,C):
def gogo(self):
print("NMSL")
super().go() d1 = D()
d1.gogo()
print(D.__mro__)

运行后输出结果:

NMSL
go A1 go
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.A1'>, <class '__main__.A2'>, <class '__main__.C'>, <class '__main__.A3'>, <class 'object'>)

可以看到结果还是这样。

如果D类中不定义方法,仅仅在类的外部通过实例调用go方法,查找过程也是一样的。

如图:

class D(B,C):
pass
d1 = D()
d1.go()
print(D.__mro__)

结果:

NMSL
go A1 go
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.A1'>, <class '__main__.A2'>, <class '__main__.C'>, <class '__main__.A3'>, <class 'object'>)

以上就是对于super()函数的个人看法。

Python3中的super()函数详解的更多相关文章

  1. Oracle中的substr()函数 详解及应用

    注:本文来源于<Oracle中的substr()函数 详解及应用> 1)substr函数格式   (俗称:字符截取函数) 格式1: substr(string string, int a, ...

  2. python super()函数详解

    引言: 在类的多继承使用场景中,重写父类的方法时,可能会考虑到需要重新调用父类的方法,所以super()函数就是比较使用也很必要的解决方法: 文章来源: http://www.cnblogs.com/ ...

  3. eclipse 设置文本模板中 insert variable... 函数 详解

    设置文本模板简要图: 设置文本模板详细过程:http://www.cnblogs.com/lsy131479/p/8478711.html 此处引出设置文本模板中 insert variable... ...

  4. Oracle中的instr()函数 详解及应用

    1)instr()函数的格式  (俗称:字符查找函数) 格式一:instr( string1, string2 )    /   instr(源字符串, 目标字符串) 格式二:instr( strin ...

  5. oracle中的trim()函数详解

    1.先看一下Oracle TRIM函数的完整语法描述 TRIM([ { { LEADING | TRAILING | BOTH }[ trim_character ]| trim_character} ...

  6. [fork]Linux中的fork函数详解

    ---------------------------------------------------------------------------------------------------- ...

  7. Python中的getattr()函数详解

    最近看Dive into python第四章自省中提到getattr()函数,作为一个内建函数平时自己没怎么用过所以也不太理解这个函数的一些用法 看了下函数本身的doc getattr(object, ...

  8. MATLAB中的参数估计函数详解及调用示例【联合整理】

    前言 因为最近项目上的需要,才发现MATLAB的统计工具箱中的参数估计函数,觉得很简单很好用,现在把所有的参数估计函数整理一下,并在最后面附上调用示例. 参与人员 由于时间关系,这篇随笔是两个人一起整 ...

  9. python中的 zip函数详解

    python中zip()函数用法举例 定义:zip([iterable, ...]) zip()是Python的一个内建函数,它接受一系列可迭代的对象作为参数,将对象中对应的元素打包成一个个tuple ...

随机推荐

  1. 【20.51%】【codeforces 610D】Vika and Segments

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  2. 基于Nutch+Hadoop+Hbase+ElasticSearch的网络爬虫及搜索引擎

    基于Nutch+Hadoop+Hbase+ElasticSearch的网络爬虫及搜索引擎 网络爬虫架构在Nutch+Hadoop之上,是一个典型的分布式离线批量处理架构,有非常优异的吞吐量和抓取性能并 ...

  3. docker(整理中

    docker镜像默认的下载地址就是docker的官网,而他们的官网在国内没有节点,时不时就被国家防火墙隔绝,会出现DNS解析不到,或者找不到镜像等狗血提示. 解决的方法有三个: 第一,就是不断尝试,因 ...

  4. SpringBoot-Swagger整合zuul智能列表

    SpringBoot-Swagger整合zuul智能列表 简介 可能大家都有用过swagger,可以通过ui页面显示接口信息,快速和前端进行联调. 现在基本都是多模块微服务化,每个服务都有这样的ui页 ...

  5. springboot 动态修改定时任务

    1.静态定时 1)启动类加上注解@EnableScheduling @EnableAsync @EnableScheduling @SpringBootApplication @MapperScan( ...

  6. ELK学习实验006:Nginx的日志分析系统之filebeat配置

    一 Filebeat工作原理 Filebeat由两个主要组件组成: prospector和 harvester 1.1 harvester 负责读取单个文件的内容 如果文件在读取时被制除或重命名, F ...

  7. Docker常用命令速查手册(华贵铂金版)

    原创声明:作者:Arnold.zhao  博客园地址:https://www.cnblogs.com/zh94 Docker常用命令速查手册 搜索仓库镜像 docker search nginx 获取 ...

  8. OpenJ_Bailian 2815 城堡问题(DFS)

    题目传送门OpenJ_Bailian 2815 描述 1 2 3 4 5 6 7 ############################# 1 # | # | # | | # #####---### ...

  9. spring boot学习笔记(1)

    一.构建springboot项目 可以通过idea的springboot initialization来创建, idea的功能很强大,可以自己选择需要集成的插件. 完整的项目结构是这样的: DemoA ...

  10. GitHub项目绑定自己的域名

    github博客搭建:https://blog.csdn.net/walkerhau/article/details/77394659?utm_source=debugrun&utm_medi ...