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获取远程文件大小的函数代码分享
May 13 Python
python中的sort方法使用详解
Jul 25 Python
开源软件包和环境管理系统Anaconda的安装使用
Sep 04 Python
python修改list中所有元素类型的三种方法
Apr 09 Python
获取python的list中含有重复值的index方法
Jun 27 Python
使用 Python 实现简单的 switch/case 语句的方法
Sep 17 Python
pyside+pyqt实现鼠标右键菜单功能
Dec 08 Python
Django框架基础模板标签与filter使用方法详解
Jul 23 Python
详解程序意外中断自动重启shell脚本(以Python为例)
Jul 26 Python
django 通过URL访问上传的文件方法
Jul 28 Python
python的常见矩阵运算(小结)
Aug 07 Python
浅谈OpenCV中的新函数connectedComponentsWithStats用法
Jul 05 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 socket并借助telnet实现简单的聊天程序
2013/06/18 PHP
php创建多级目录的方法
2015/03/24 PHP
PHP数学运算函数大汇总(经典值得收藏)
2016/04/01 PHP
PHP类型约束用法示例
2016/09/28 PHP
php实现图片按比例截取的方法
2017/02/06 PHP
如何直接访问php实例对象中的private属性详解
2017/10/12 PHP
文本链接逐个出现的js脚本
2007/12/12 Javascript
jQuery 图像裁剪插件Jcrop的简单使用
2009/05/22 Javascript
XMLHTTPRequest的属性和方法简介
2010/11/23 Javascript
基于prototype扩展的JavaScript常用函数库
2010/11/30 Javascript
Jquery使用Firefox FireBug插件调试Ajax步骤讲解
2013/12/02 Javascript
NODE.JS加密模块CRYPTO常用方法介绍
2014/06/05 Javascript
javascript生成不重复的随机数
2015/07/17 Javascript
JS+CSS实现自动切换的网页滑动门菜单效果代码
2015/09/14 Javascript
JS回调函数简单用法示例
2017/02/09 Javascript
原生JS实现圣旨卷轴展开效果
2017/03/06 Javascript
easyui-datagrid特殊字符不能显示的处理方法
2017/04/12 Javascript
5分钟打造简易高效的webpack常用配置
2017/07/04 Javascript
详解Koa中更方便简单发送响应的方式
2018/07/20 Javascript
微信小程序 setData 对 data数据影响问题
2019/04/18 Javascript
如何利用node转发请求详解
2020/09/17 Javascript
Python实现的数据结构与算法之基本搜索详解
2015/04/22 Python
Python3结合Dlib实现人脸识别和剪切
2018/01/24 Python
Python实现的大数据分析操作系统日志功能示例
2019/02/11 Python
Python CVXOPT模块安装及使用解析
2019/08/01 Python
Python使用pyexecjs代码案例解析
2020/07/13 Python
意大利奢华内衣制造商:Cosabella
2017/08/29 全球购物
泰国办公用品购物网站:OfficeMate
2018/02/04 全球购物
法国在线宠物店:zooplus.fr
2018/02/23 全球购物
Nike比利时官网:Nike.com (BE)
2019/02/07 全球购物
简历自我评价模版
2014/01/31 职场文书
节能环保演讲稿
2014/08/28 职场文书
2014年督导工作总结
2014/11/19 职场文书
优秀教师个人材料
2014/12/15 职场文书
职工趣味运动会开幕词
2016/03/04 职场文书
2016年小学教师师德承诺书
2016/03/25 职场文书