文档章节

超级有用的工具 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
Ubuntu的sudo与su命令使用与开启root帐户 2012-04-30

今天介绍两个Ubuntu命令: sudo 和 su sudo意思就是super-user do,让当前用户暂时以管理员的身份root来执行这条命令。 su是用来改变当前用户的,su root,就是将当前用户切换为root,用了su ...

qbcs
2012/06/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

(一)软件测试专题——之Linux常用命令篇01

本文永久更新地址:https://my.oschina.net/bysu/blog/1931063 【若要到岸,请摇船:开源中国 不最醉不龟归】 Linux的历史之类的很多书籍都习惯把它的今生来世,祖宗十八代都扒出来,美其名曰...

不最醉不龟归
25分钟前
6
0
蚂蚁金服Java开发三面

8月20号晚上8点进行了蚂蚁金服Java开发岗的第三面,下面开始: 自我介绍(要求从实践过程以及技术背景角度着重介绍) 实习经历,说说你在公司实习所做的事情,学到了什么 关于你们的交易平台...

edwardGe
32分钟前
7
0
TypeScript基础入门 - 函数 - this(三)

转载 TypeScript基础入门 - 函数 - this(三) 项目实践仓库 https://github.com/durban89/typescript_demo.gittag: 1.2.4 为了保证后面的学习演示需要安装下ts-node,这样后面的每个操作都能...

durban
41分钟前
0
0
Spark core基础

Spark RDD的五大特性 RDD是由一系列的Partition组成的,如果Spark计算的数据是在HDFS上那么partition个数是与block数一致(大多数情况) RDD是有一系列的依赖关系,有利于Spark计算的容错 RDD中每...

张泽立
49分钟前
0
0
如何搭建Keepalived+Nginx+Tomcat高可用负载均衡架构

一.概述 初期的互联网企业由于业务量较小,所以一般单机部署,实现单点访问即可满足业务的需求,这也是最简单的部署方式,但是随着业务的不断扩大,系统的访问量逐渐的上升,单机部署的模式已...

Java大蜗牛
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部