有什么不同?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”是做什么的?相关推荐

  1. python怎么创建方法_python中的__new__方法

    print(obj) #打印结果:<__main__.Foo object at 0x000002636FEAA208> 事实上如果(新式)类中没有重写__new__()方法,即在定义新式 ...

  2. python怎么调用方法_python中怎么调用自己的方法

    展开全部 C/C++对Python的调用2113层次可5261以分为三个层次, (1) 高层次的调用, (2)纯Python调用, (3) Python方法的4102扩展(也就使向Python输出调用 ...

  3. python csv读写方法_python中csv文件的若干读写方法小结

    如下所示: //用普通文本文件方式打开和操作 with open("'file.csv'") as cf: lines=cf.readlines() ...... //用普通文本方 ...

  4. python tabula 使用方法_Python中os.walk()的使用方法

    os.walk()主要用来扫描某个指定目录下所包含的子目录和文件.这篇文章将通过几个简单的例子来说明python中os.walk()的使用方法. 假设我们的test文件夹有如下的目录结构: 我们首先用 ...

  5. python list排序方法_python中List的sort方法指南

    简单记一下python中List的sort方法(或者sorted内建函数)的用法. List的元素可以是各种东西,字符串,字典,自己定义的类等. sorted函数用法如下: sorted(data, ...

  6. python图表制作方法_Python中一种简单的动态图表制作方法

    在读技术博客的过程中,我们会发现那些能够把知识.成果讲透的博主很多都会做动态图表.他们的图是怎么做的?难度大吗?这篇文章就介绍了Python中一种简单的动态图表制作方法. 数据暴增的年代,数据科学家. ...

  7. python的id方法_python中id()函数的实用研究实例

    python中id()函数的实用研究实例 >>> a = 2.5 >>> b = 2.5 >>> c = b >>> a is ...

  8. python json解析方法_Python 中的 JSON 方式讲解

    Python的dict对象可以直接序列化为JSON的{},不过,很多时候,我们更喜欢用class表示对象,比如定义Student类,然后序列化,代码如下:import json class Stude ...

  9. python函数isdisjoint方法_Python中的isdisjoint()函数

    在本文中,我们将学习如何在set()数据类型上实现isdisjoint()函数.此函数检查作为参数传递的集合是否具有任何共同的元素.如果找到任何元素,则返回False,否则返回True. 除了设置输入 ...

最新文章

  1. 转 ofbiz的webservice接口提供(2)-数据类型的局限性
  2. 4.QML动画——概念、动画应用方式和动画的缓动曲线
  3. js防止表单重复提交
  4. k8s 里的kv和kvs
  5. IconFont的制作使用
  6. 用R在地图上绘制网络图的三种方法
  7. Python版快速排序算法
  8. python下载安装教程-Python和Anoconda和Pycharm安装教程
  9. 如何简单解释 MapReduce算法
  10. URAL 1001 Reverse root
  11. ADB常用命令及详解
  12. LoadLibrary动态加载dll失败,GetLastError返回错误码126
  13. 【转】javascript实现图片的连续滚动
  14. 使用jquery.lazyload.js图片预加载(懒加载)遇到的问题,图片加载不出来
  15. Chfs 文件共享工具
  16. 十进制换算成二进制、八进制、十六进制
  17. 此应用 DCloud APPID 非当前账号所有,请联系应用所有者(即此Appid的创建者)设置你的账号为协作者(在https://dev.dcloud.net.cn操作),或重新生成 APPID 后
  18. 三种方法,刷新 Android 的 MediaStore!让你保存的图片立即出现在相册里!
  19. 堡垒机和防火墙有什么区别?
  20. eclipse创建servlet,filter产生classnotfound错误

热门文章

  1. 打印出系统所有即未被assign到business transaction和IBASE component的product ID列表
  2. 如何让context attribute不出现在configuration界面的available fields列表内
  3. SAP ABAP实用技巧介绍系列之 快速找出function module的帮助文档
  4. @capire/common is not needed at runtime at all
  5. SAP CRM呼叫中心里Case ID的生成逻辑
  6. 5分钟部署一个Hello World Servlet到CloudFoundry
  7. java xml解析_XML的理解以及SAX解析流程
  8. js中在表格中增加一列的方法_Excel表格中需要提取一列内容末尾的数字,同事分分钟完成...
  9. mybatis generator 中文注释_mybatis代码生成器,提高开发效率
  10. 美团flutter_ggtalk 聊聊跨平台:后起之秀 Flutter