文档章节

超级有用的工具 super()

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

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

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

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

 

 

将代码改为用super():

 

 

 

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

 

 

 

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

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

    

 

 

 

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

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

 

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

© 著作权归作者所有

共有 人打赏支持
I
粉丝 0
博文 3
码字总数 1560
作品 0
长春
程序员
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
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
Java™ 编译器--Janino

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

匿名
2013/04/02
2.9K
0
HDFS中的文件访问权限(4)

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

肖鋭
2014/02/22
0
0
Linux文件系统2---VFS的四个主要对象

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

chungle2011
05/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

分布式块存储的引擎如何设计?

前言: 目前在万兆网络和SSD,包括NVMe SSD 都已经非常普及。随着硬件的速度越来越快,性能的瓶颈会从硬件转移到软件。尤其对于存储引擎来说,性能至关重要。 先来看一下我们会对数据存储引擎...

Java干货分享
15分钟前
0
0
docker(五):docker-compose.yml 配置

docker-compose.yml常用命令 image 指定镜像名称或者镜像id,如果该镜像在本地不存在,Compose会尝试pull下来。 示例: image: java build 指定Dockerfile文件的路径。可以是一个路径,例如...

开心的哈士奇
19分钟前
0
0
Tale的升级真是惊心动魄,吓死人

精心动魄的博客升级计划,Tale 这几天在筹划将分散在其他几个地方的博客统一到这里来,也就留意了tale的更新,发现出现了2.0.1版本; 因此动了升级的念头,唉! 高估了个人开放着的系统规划能...

硅步积千里
29分钟前
0
0
tcc分布式事物

因为最近公司的新退货系统用到了spring cloud。所以会涉及到一些分布式事物。 所以需要先了解一下,分布式事物。 shuaiqiyu / hmily 高性能异步分布式事务TCC框架 谭纳 / spring-cloud-rest-...

miaojiangmin
30分钟前
0
0
20181016 上课截图

小丑鱼00
36分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部