super()函数_super(_thread_prototypeself).__init__()-程序员宅基地

技术标签: super  Python  

引入目的

引入这个函数的目的就是帮助程序员找出相应的父类,然后方便调用相关属性

Python的继承以及调用父类成员

python子类调用父类成员有2种方法,分别是普通方法和super方法。

1、普通方法

#! /usr/bin/env python
#coding=utf-8

class Base(object):
    def __init__(self):
        print "Base init"

class Leaf(Base):
    def __init__(self):
        Base.__init__(self) #普通方法
        print "Leaf init"

if __name__ == '__main__':

     leaf = Leaf()

也就是使用非绑定的类方法(用类名来引用的方法),并在参数列表中,引入待绑定的对象(self),从而达到调用父类的目的。

这样做的缺点是,当一个子类的父类发生变化时(如类Leaf的父类由Base变为C时),必须遍历整个类定义,把所有的通过非绑定的方法的类名全部替换过来。

如果代码量庞大,这样的修改可能是灾难性的。

super()函数就是为解决该问题而设计的。

2、super方法

#! /usr/bin/env python
#coding=utf-8

class Base(object):
    def __init__(self):
        print "Base init"

class Leaf(Base):
    def __init__(self):
        super(Leaf, self).__init__() #super方法!!!
        print "Leaf init"

if __name__ == '__main__':

     leaf = Leaf()

结果:

Base init
Leaf init

结果一致,但修改的代码只有一处,把代码的维护量降到最低。

对于super(Leaf, self).__init__()是这样理解的:super(Leaf, self)首先找到Leaf的父类(就是类Base),然后把类Leaf的对象self转换为类Base的对象(通过某种方式),然后“被转换”的类Base对象调用自己的__init__函数。

总结

1. super并不是一个函数,是一个类名,形如super(B, self)事实上调用了super类的初
始化函数,产生了一个super对象;
2. super类的初始化函数并没有做什么特殊的操作,只是简单记录了类类型和具体实例;
3. super(B, self).func的调用并不是用于调用当前类的父类的func函数;
4. Python的多继承类是通过mro的方式来保证各个父类的函数被逐一调用,而且保证每个父
类函数只调用一次(如果每个类都使用super);
5. 混用super类和非绑定的函数是一个危险行为,这可能导致应该调用的父类函数没有调用或
者一个父类函数被调用多次。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/will130/article/details/50925164

智能推荐

特别喜欢的几句话共勉-程序员宅基地

文章浏览阅读159次。我不能保证写的每个地方都是对的,但是至少能保证不复制、不黏贴,保证每一句话、每一行代码都经过了认真的推敲、仔细的斟酌。每一篇文章的背后,希望都能看到自己对于技术、对于生活的态度。我相信乔布斯说的,只有那些疯狂到认为自己可以改变世界的人才能真正地改变世界。面对压力,我可以挑灯夜战、不眠不休;面对困难,我愿意迎难而上、永不退缩。其实我想说的是,我只是一个程序员,这就是我现在纯粹人生的全部。真实地去生活..._特别喜欢的几句话共勉

分布式事务xxl-job_xxl-job spring 事务-程序员宅基地

文章浏览阅读482次。2、注解配置:为Job方法添加注解 "@XxlJob(value="自定义jobhandler名称", init = "JobHandler初始化方法", destroy = "JobHandler销毁方法")",注解value值对应的是调度中心新建任务的JobHandler属性的值。* 4、任务结果:默认任务结果为 "成功" 状态,不需要主动设置;打开项目修改变成蓝色的配置文件中的datasource(配自己的数据库)运行admin即可。//写自己的定时任务。_xxl-job spring 事务

51单片机矩阵密码锁_51单片机密码锁代码-程序员宅基地

文章浏览阅读596次。51单片机矩阵密码锁,直接复制就可以了;实现了获取行和列这里是获取行和列。_51单片机密码锁代码

贫穷让人扭曲,阶级让人绝望|独秀日记_贫穷扭曲人性-程序员宅基地

文章浏览阅读165次。有个同学,小青,跟她小学初中都一个班。在校时,咱比较内向害羞,少跟女同学聊天,初中毕业后,我去了市里上高中,后面再到北方上大学,毕业了也是在外地工作,貌似她初中毕业后就没再上学。那会儿也没有什么手机QQ微信,自然更少联系,有20年了吧,偶尔过年有个同学聚会什么的,见过几次。大家陆续成家,过着各自的小日子,在同学的微信群,她跟我都还是像学生时代那样,不是很喜欢露面,多是潜水。后面听另外一个同学说她在市区卖房,新房二手房都卖,正好那阵子小姨子打算回老家买房安家,不想再在深圳漂了,毕竟没户口,房价太高,._贫穷扭曲人性

斐波那契数列的迭代算法和递归算法_斐波那契数列递归-程序员宅基地

文章浏览阅读8.4k次,点赞4次,收藏52次。斐波那契数列(Fibonacci sequence),又称“黄金分割数列“,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此......_斐波那契数列递归

mvn help:effective-pom命令的作用_effective pom-程序员宅基地

文章浏览阅读3k次,点赞2次,收藏2次。无论 POM 文件中是否显示的声明,所有的 POM 均继承自一个父 POM,这个父 POM 被称为 `Super POM`。在pom的继承关系中,`子pom可以覆盖父pom中的配置`;`如果子pom没有覆盖,那么父pom中的配置将会被继承`。按照这个规则,继承关系中的所有pom叠加到一起,就`生成一个最终生效的pom`。maven实际运行的过程中,执行构建操作就是按照这个`最终的pom`运行起来的。_effective pom

随便推点

Linux Mint装机--mint下fcitx输入法的安装与配置_linuxmint21 fcitx4-程序员宅基地

文章浏览阅读4.7k次。大概新手人都曾纠结过LinuxMint下的输入法配置问题。其实这个问题也挺容易的。下面我就以安装ppa源中的sogou输入法为例来为大家讲解:安装搜狗输入法大概用如下命令就能解决了:sudo add-apt-repository ppa:fcitx-team/nightlysudo aptitude updatesudo aptitude install fcitx f_linuxmint21 fcitx4

浅谈Java串行端口技术协议_java 标准串口协议格式-程序员宅基地

文章浏览阅读1.5k次。http://www.yesky.com/50/1894050_3.shtml串行通讯慨述  串行通讯协议有很多种,像RS232,RS485,RS422,甚至现今流行的USB等都是串行通讯协议。而串行通讯技术的应用无处不在。可能大家见的最多就是电脑的串口与Modem的通讯。记得在PC机刚开始在中国流行起来时(大约是在90年代前五年),那时甚至有人用一条串行线进行两台电脑之间的数_java 标准串口协议格式

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate elemen-程序员宅基地

文章浏览阅读1.3k次。有的时候定位元素,反复检查写的代码没问题啊,但是就是定位不到,后来发现是页面没加载到,设置隐式等待时间就解决了。driver.implicitly_wait(5)_n.exceptions.nosuchelementexception: message: no such element: unable to loc

php导出excel数据大无法导出,PHPExcel导入导出大文件报500错误的官方解决方案-程序员宅基地

文章浏览阅读1.2k次。PHP导出excel想必很多童鞋都碰到了,使用phpexcel类也确实方便,但导出大量数据的时候就没那么简单了,常常会伴随一些超时或内存溢出的问题,下面就给大家介绍一些方法,文章由原作者整理,出处PHPExcel导出大量数据超时及内存错误解决方法PHPExcel是一个很强大的处理Excel的PHP开源类,但是很大的一个问题就是它占用内存太大,从1.7.3开始,它支持设置cell的缓存方式,但是推荐..._phpexcel 导出数据超过5000 无响应

ffmpeg之H264_ffmpeg h264-程序员宅基地

文章浏览阅读3.3k次。无_ffmpeg h264

c语言实现全排列并存储,用c语言实现全排列-程序员宅基地

文章浏览阅读282次。#include /************************************************************************//* 功能:实现两个整形参数值交换/* 参数:/* lhs--int类型的指针,指向待交换数1的地址/* rhs--int类型的指针,指向待交换数2的地址/***************************..._全排列存储