python之super的使用小结


Posted in Python onAugust 13, 2018

为什么需要super

在python没有引入super之前, 如果需要在子类中引用父类的方法, 一般写法如下:

class Father:
 def whoami(self):
  print("I am father")


class Child:
 def whoami(self):
  print("I am child")
  Father.whoami(self)

这样看好像没什么问题, 就算没有super也能正常调用父类的方法, 但是如果有一天Father类需要修改类名为Father1, 那么子类Child中也必须跟着修改.

想象下如果一个类有很多个子类, 这样一来我们就需要修改每个子类中引用父类的语句

怎么使用super

Help on class super in module builtins:

class super(object)
 | super() -> same as super(__class__, <first argument>)
 | super(type) -> unbound super object
 | super(type, obj) -> bound super object; requires isinstance(obj, type)
 | super(type, type2) -> bound super object; requires issubclass(type2, type)
 | Typical use to call a cooperative superclass method:
 | class C(B):
 |   def meth(self, arg):
 |     super().meth(arg)
 | This works for class methods too:
 | class C(B):
 |   @classmethod
 |   def cmeth(cls, arg):
 |     super().cmeth(arg)

我们来看看super的帮助文档, 首先super是一个类, 它的调用方法有如下几种:

1.super()
2.super(type)
3.super(type, obj)
4.super(type, type2)

我们推荐用第一种方法来使用super, 因为它并不需要显式传递任何参数.但是要注意一点, super只能在新式类中使用.

class A:
 def __init__(self):
  print("this is A")

class B(A):
 def __init__(self):
  super().__init__()
  print("this is B")

b = B()

"""
this is A
this is B
"""

看起来super就像直接调用了B的父类A的__init__, 其实并不是这样的, 我们看看super在多继承下的使用

class A:
 def __init__(self):
  print("this is A")
  print("leave A")

class B(A):
 def __init__(self):
  print("this is B")
  super().__init__()
  print("leave B")

class C(A):
 def __init__(self):
  print("this is C")
  super().__init__()
  print("leave C")
 

class D(B, C):
 def __init__(self):
  print("this is D")
  super().__init__()
  print("leave D")  
  
d = D()

"""
this is D
this is B
this is C
this is A
leave A
leave C
leave B
leave D
"""

print(D.__mro__)
"""
(<class '__main__.D'>, 
<class '__main__.B'>, 
<class '__main__.C'>, 
<class '__main__.A'>, 
<class 'object'>)
"""

这里可以看到, 如果super只是简单调用父类的方法的话, 那么调用了B的__init__ 方法之后, 应该调用A的__init__ 才对, 但是调用的却是C的__init__ 方法

这是因为super调用的是当前类在MRO列表中的后一个类, 而并不是简单地调用当前类的父类

python并没有强制性限制我们使用super调用父类, 我们还是可以使用原始的方法来调用父类中的方法, 但是需要注意的是调用父类的方法要统一, 即全用super或全不用super, 而用super 的话, 调用的方式也最好是统一的

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python时间整形转标准格式的示例分享
Feb 14 Python
Python递归遍历列表及输出的实现方法
May 19 Python
Python生成随机数组的方法小结
Apr 15 Python
python实现列表中由数值查到索引的方法
Jun 27 Python
在python下读取并展示raw格式的图片实例
Jan 24 Python
浅谈Python反射 &amp; 单例模式
Mar 21 Python
PyQt5 窗口切换与自定义对话框的实例
Jun 20 Python
通过celery异步处理一个查询任务的完整代码
Nov 19 Python
python误差棒图errorbar()函数实例解析
Feb 11 Python
利用python控制Autocad:pyautocad方式
Jun 01 Python
高考考python编程是真的吗
Jul 20 Python
用Python的绘图库(matplotlib)绘制小波能量谱
Apr 17 Python
Selenium控制浏览器常见操作示例
Aug 13 #Python
详解python3中的真值测试
Aug 13 #Python
利用Python将每日一句定时推送至微信的实现方法
Aug 13 #Python
Selenium鼠标与键盘事件常用操作方法示例
Aug 13 #Python
python删除字符串中指定字符的方法
Aug 13 #Python
Django contenttypes 框架详解(小结)
Aug 13 #Python
Python中的Numpy矩阵操作
Aug 12 #Python
You might like
php ci框架中加载css和js文件失败的原因及解决方法
2014/07/29 PHP
THINKPHP截取中文字符串函数实例代码
2017/03/20 PHP
PHP的介绍以及优势详细分析
2019/09/05 PHP
PHP pthreads v3下同步处理synchronized用法示例
2020/02/21 PHP
JQUERY THICKBOX弹出层插件
2008/08/30 Javascript
jquery中页面Ajax方法$.load的功能使用介绍
2014/10/20 Javascript
一款基于jQuery的图片场景标注提示弹窗特效
2015/01/05 Javascript
JavaScript html5 canvas画布中删除一个块区域的方法
2016/01/26 Javascript
javaScript如何跳出多重循环break、continue
2016/09/01 Javascript
探索Vue.js component内容实现
2016/11/03 Javascript
JavaScript实现封闭区域布尔运算的示例代码
2018/06/25 Javascript
简单了解vue.js数组的常用操作
2019/06/17 Javascript
ES6基础之数组和对象的拓展实例详解
2019/08/22 Javascript
js全屏事件fullscreenchange 实现全屏、退出全屏操作
2019/09/17 Javascript
[00:33]2018DOTA2亚洲邀请赛TNC出场
2018/04/04 DOTA
在Python中操作日期和时间之gmtime()方法的使用
2015/05/22 Python
简单介绍Python中的几种数据类型
2016/01/02 Python
浅谈django中的认证与登录
2016/10/31 Python
Python获取指定文件夹下的文件名的方法
2018/02/06 Python
python中的单引号双引号区别知识点总结
2019/06/23 Python
Python浮点数四舍五入问题的分析与解决方法
2019/11/19 Python
flask的orm框架SQLAlchemy查询实现解析
2019/12/12 Python
python基于三阶贝塞尔曲线的数据平滑算法
2019/12/27 Python
Python多线程通信queue队列用法实例分析
2020/03/24 Python
python 安装库几种方法之cmd,anaconda,pycharm详解
2020/04/08 Python
Python捕获异常堆栈信息的几种方法(小结)
2020/05/18 Python
PyInstaller运行原理及常用操作详解
2020/06/13 Python
安装并免费使用Pycharm专业版(学生/教师)
2020/09/24 Python
8款精美的CSS3表单设计(登录表单/下拉选择/按钮附演示及源码)
2013/02/04 HTML / CSS
I.T中国官网:精选时尚设计师单品网购平台
2018/03/26 全球购物
STAUD官方网站:洛杉矶独有的闲适风格
2019/04/11 全球购物
法律专业推荐信范文
2013/11/29 职场文书
大学生社会实践活动总结
2014/07/03 职场文书
中学教师个人总结
2015/02/10 职场文书
postgresql 删除重复数据案例详解
2021/08/02 PostgreSQL
Redis过期数据是否会被立马删除
2022/07/23 Redis