文档章节

超级有用的工具 super()

I
 Ihonghong
发布于 2017/02/23 20:04
字数 594
阅读 25
收藏 0

如何正确使用super()函数,社实际上是人们在Python中理解最差的知识点之一。偶尔我们会看到一些代码直接电泳父类中的方法。就像这样:

  对于大部分的代码而言来说这样做都行得通,但是在设计多继承的代码里,这样会导致出现器官的麻烦。比如,考虑下面的例子:

结果如下,发现基类one被调用了两次,也许没什么毛病,但在一些情况下可能会产生严重的错误。

 

 

将代码改为用super():

 

 

 

发现每个构造函数都是用了一次,多么合理。

 

 

 

究其原因,针对每一个定义的类,Python都会计算出一个称为方法的解析顺序(MRO)的列表。MRO列表知识简单的对基类进行线性排列。这种排列不一定会按照我们声明的父类列表那样。这是通过复杂的计算实现的,我们不需要了解,例如上端代码的MRO列表是:

重要的一点是,就像MRO的顺序一样,从底层一层一层的传递,直到顶层的那个函数。这样就出现一种情况,当中间的某一个子类没有要调用的函数时,同样也会继续向上传递。就如下面的例子

    

 

 

 

尽管A类并没有spam()函数,但依然会向上传递。直到找到最上层的实际的spam()函数。尽管Python内部通过复杂的数学计算出了MRO列表让继承有了顺序有了参照。但这并不是最适当的顺序,甚至是不恰当的顺序,会造成严重的错误,比如在两个父类之间循环了,这就麻烦了。往往呢这样错误还挺多,这就要求我们在代码的设计过程中要不断测试。如果出现如下常见的错误提示:

代表着MRO是不恰当的顺序,这就要求我们尝试着调换父类的继承顺序了,一般都能解决。

 

提示:当父类比较多时,最好将同名的方法参数数量,参数名称相同,这样不影响结果,反而会确保super()能传递到上层最终的函数。

© 著作权归作者所有

共有 人打赏支持
上一篇: 构建RPM包实践
I
粉丝 0
博文 3
码字总数 1560
作品 0
长春
程序员
私信 提问
LeetCode:Super Ugly Number - 超级丑数

1、题目名称 Super Ugly Number(超级丑数) 2、题目地址 https://leetcode.com/problems/super-ugly-number/ 3、题目内容 英文: Write a program to find the nth super ugly number. Sup......

北风其凉
2015/12/19
2.8K
2
linux 下 /bin /sbin 的区别

/bin,/sbin,/usr/bin,/usr/sbin区别/ : this is root directory root 用户根目录/bin : commands in this dir are all system installed user commands 系统的一些指令/sbin: commands in th......

souldepth
2014/05/08
0
0
Java™ 编译器--Janino

Janino是一个超级小但又超级快的Java™ 编译器. 它不仅能像javac工具那样讲一组源文件编译成字节码文件,还可以对一些Java表达式,代码块,类中的文本(class body)或者内存中源文件进行编译,...

匿名
2013/04/02
2.9K
0
Linux文件系统2---VFS的四个主要对象

https://www.cnblogs.com/smartjourneys/p/7260911.html 1.引言 本文所述关于文件管理的系列文章主要是对陈莉君老师所讲述的文件系统管理知识讲座的整理。 Linux可以支持不同的文件系统,它源...

chungle2011
2018/05/11
0
0
HDFS中的文件访问权限(4)

在Linux中针对文件和目录,都要权限模式,而HDFS中也有与POSIX非常相似的权限模式。 一共提供三类权限模式:只读权限(r),写入权限(w)和可执行权限(x). 读取文件或列出目录内容时需要只读权限...

肖鋭
2014/02/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

搜索引擎(Lucene-索引详解)

IndexWriter详解 问题1:索引创建过程完成什么事? 回顾架构图 Lucene索引创建API 图示 Lucene索引创建代码示例 public static void main(String[] args) throws IOException { // 创建...

这很耳东先生
18分钟前
1
0
JavaScript数据结构之栈实例用法

在本篇文章里小编给大家分享了关于JavaScript数据结构之栈实例用法内容,写的十分的全面细致,具有一定的参考价值,对此有需要的朋友可以参考学习下。如有不足之处,欢迎批评指正。 栈 先来看...

前端攻城老湿
29分钟前
1
0
springboot 使用 redis 管理session

1.pom.xml 引入依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-redis</artifactId> </dependency><dependency> ......

狼王黄师傅
29分钟前
1
0
Js取小数点后两位四种方法

在本篇文章里小编给大家分享了关于js取小数点后两位四种方法和实例代码,写的十分的全面细致,具有一定的参考价值,对此有需要的朋友可以参考学习下。如有不足之处,欢迎批评指正。 Javascri...

前端攻城小牛
35分钟前
1
0
js 唤端

h5页面唤起app const appDownload = () => { // 分享- 唤起 - 下载function failed() {window.location = '应用商店的scheme '}function transfer(cb) {window.location.href =......

何祯粮
35分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部