python的super方法_Python中“super”是做什么的?
有什么不同?SomeBaseClass.__init__(self)
意味着调用SomeBaseClass的__init__。而
super(Child, self).__init__()
意味着__init__从Child实例的方法解析顺序中的父类调用一个绑定。
如果实例是Child的一个子类,则在方法解析顺序中可能会有另一个父类。
Python 2与3
这在Python 2和3中工作:
super(Child, self).__init__()
这只适用于Python 3:
super().__init__()
它通过在堆栈框架中移动并获得方法的第一个参数(通常self用于实例方法或cls类方法 - 但可以是其他名称)并Child在自由变量中找到类(例如,它在名称中__class__作为一个自由的关闭变量在方法中查找)。
我倾向于演示使用交叉兼容的方式super,但是如果您只使用Python 3,则可以不带参数地调用它。
具有向前兼容性的间接性
它给你什么?对于单一继承,从静态分析的角度来看,这个问题的例子实际上是相同的。但是,使用super向前兼容性给你一个间接层。
向前兼容对于经验丰富的开发人员非常重要。您希望自己的代码在更改时能够保持最小的更改。当你看你的修订历史,你想看看什么时候改变。
你可以从单一的继承开始,但是如果你决定添加另一个基类,你只需要改变这个基础 - 如果基类在你继承的类中改变(比如添加了一个mixin),你会改变这课没有什么 特别是在Python 2中,将参数取得超级以及正确的方法参数是很困难的。如果你知道你正在使用super单一的继承,这使得调试更困难的前进。
依赖注入
其他人可以使用你的代码,并将父母注入方法解析:
class SomeBaseClass(object):def __init__(self):print('SomeBaseClass.__init__(self) called')class UnsuperChild(SomeBaseClass):def __init__(self):print('UnsuperChild.__init__(self) called')SomeBaseClass.__init__(self)class SuperChild(SomeBaseClass):def __init__(self):print('SuperChild.__init__(self) called')super(SuperChild, self).__init__()
假设你添加了另一个类到你的对象,并且希望在Foo和Bar之间插入一个类(用于测试或其他原因):
class InjectMe(SomeBaseClass):def __init__(self):print('InjectMe.__init__(self) called')super(InjectMe, self).__init__()class UnsuperInjector(UnsuperChild, InjectMe): passclass SuperInjector(SuperChild, InjectMe): pass
使用un-super子程序将无法注入依赖项,因为您正在使用的子项对要调用的方法进行硬编码:
>>> o = UnsuperInjector()UnsuperChild.__init__(self) calledSomeBaseClass.__init__(self) called
但是,使用该子类的类super可以正确注入依赖关系:
>>> o2 = SuperInjector()SuperChild.__init__(self) calledInjectMe.__init__(self) calledSomeBaseClass.__init__(self) called
结论
始终用于super引用父类。
你打算引用下一个在线的父类,而不是专门看到孩子继承的父类。
不使用super可以给你的代码的用户带来不必要的限制。
python的super方法_Python中“super”是做什么的?相关推荐
- python怎么创建方法_python中的__new__方法
print(obj) #打印结果:<__main__.Foo object at 0x000002636FEAA208> 事实上如果(新式)类中没有重写__new__()方法,即在定义新式 ...
- python怎么调用方法_python中怎么调用自己的方法
展开全部 C/C++对Python的调用2113层次可5261以分为三个层次, (1) 高层次的调用, (2)纯Python调用, (3) Python方法的4102扩展(也就使向Python输出调用 ...
- python csv读写方法_python中csv文件的若干读写方法小结
如下所示: //用普通文本文件方式打开和操作 with open("'file.csv'") as cf: lines=cf.readlines() ...... //用普通文本方 ...
- python tabula 使用方法_Python中os.walk()的使用方法
os.walk()主要用来扫描某个指定目录下所包含的子目录和文件.这篇文章将通过几个简单的例子来说明python中os.walk()的使用方法. 假设我们的test文件夹有如下的目录结构: 我们首先用 ...
- python list排序方法_python中List的sort方法指南
简单记一下python中List的sort方法(或者sorted内建函数)的用法. List的元素可以是各种东西,字符串,字典,自己定义的类等. sorted函数用法如下: sorted(data, ...
- python图表制作方法_Python中一种简单的动态图表制作方法
在读技术博客的过程中,我们会发现那些能够把知识.成果讲透的博主很多都会做动态图表.他们的图是怎么做的?难度大吗?这篇文章就介绍了Python中一种简单的动态图表制作方法. 数据暴增的年代,数据科学家. ...
- python的id方法_python中id()函数的实用研究实例
python中id()函数的实用研究实例 >>> a = 2.5 >>> b = 2.5 >>> c = b >>> a is ...
- python json解析方法_Python 中的 JSON 方式讲解
Python的dict对象可以直接序列化为JSON的{},不过,很多时候,我们更喜欢用class表示对象,比如定义Student类,然后序列化,代码如下:import json class Stude ...
- python函数isdisjoint方法_Python中的isdisjoint()函数
在本文中,我们将学习如何在set()数据类型上实现isdisjoint()函数.此函数检查作为参数传递的集合是否具有任何共同的元素.如果找到任何元素,则返回False,否则返回True. 除了设置输入 ...
最新文章
- 转 ofbiz的webservice接口提供(2)-数据类型的局限性
- 4.QML动画——概念、动画应用方式和动画的缓动曲线
- js防止表单重复提交
- k8s 里的kv和kvs
- IconFont的制作使用
- 用R在地图上绘制网络图的三种方法
- Python版快速排序算法
- python下载安装教程-Python和Anoconda和Pycharm安装教程
- 如何简单解释 MapReduce算法
- URAL 1001 Reverse root
- ADB常用命令及详解
- LoadLibrary动态加载dll失败,GetLastError返回错误码126
- 【转】javascript实现图片的连续滚动
- 使用jquery.lazyload.js图片预加载(懒加载)遇到的问题,图片加载不出来
- Chfs 文件共享工具
- 十进制换算成二进制、八进制、十六进制
- 此应用 DCloud APPID 非当前账号所有,请联系应用所有者(即此Appid的创建者)设置你的账号为协作者(在https://dev.dcloud.net.cn操作),或重新生成 APPID 后
- 三种方法,刷新 Android 的 MediaStore!让你保存的图片立即出现在相册里!
- 堡垒机和防火墙有什么区别?
- eclipse创建servlet,filter产生classnotfound错误
热门文章
- 打印出系统所有即未被assign到business transaction和IBASE component的product ID列表
- 如何让context attribute不出现在configuration界面的available fields列表内
- SAP ABAP实用技巧介绍系列之 快速找出function module的帮助文档
- @capire/common is not needed at runtime at all
- SAP CRM呼叫中心里Case ID的生成逻辑
- 5分钟部署一个Hello World Servlet到CloudFoundry
- java xml解析_XML的理解以及SAX解析流程
- js中在表格中增加一列的方法_Excel表格中需要提取一列内容末尾的数字,同事分分钟完成...
- mybatis generator 中文注释_mybatis代码生成器,提高开发效率
- 美团flutter_ggtalk 聊聊跨平台:后起之秀 Flutter