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 相关文章推荐
pygame加载中文名mp3文件出现error
Mar 31 Python
Python使用内置json模块解析json格式数据的方法
Jul 20 Python
Python基于贪心算法解决背包问题示例
Nov 27 Python
微信跳一跳小游戏python脚本
Jan 05 Python
python中format()函数的简单使用教程
Mar 14 Python
tensorflow识别自己手写数字
Mar 14 Python
Python一句代码实现找出所有水仙花数的方法
Nov 13 Python
Pandas数据离散化原理及实例解析
Nov 16 Python
Python绘图之二维图与三维图详解
Aug 04 Python
python glom模块的使用简介
Apr 13 Python
Python机器学习算法之决策树算法的实现与优缺点
May 13 Python
Python多线程实用方法以及共享变量资源竞争问题
Apr 12 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
缅甸的咖啡简史
2021/03/04 咖啡文化
PHP 采集程序 常用函数
2008/12/18 PHP
一个经典实用的PHP图像处理类分享
2014/11/18 PHP
php防止网站被刷新的方法汇总
2014/12/01 PHP
解决phpcms更换javascript的幻灯片代码调用图片问题
2014/12/26 PHP
php创建session的方法实例详解
2015/01/27 PHP
JavaScript类型转换方法及需要注意的问题小结(挺全面)
2010/11/11 Javascript
js setTimeout 常见问题小结
2013/08/13 Javascript
javascript jq 弹出层实例
2013/08/25 Javascript
javascript特殊用法示例介绍
2013/11/29 Javascript
laypage分页控件使用实例详解
2016/05/19 Javascript
javascript中setAttribute兼容性用法分析
2016/12/12 Javascript
输入框点击时边框变色效果的实现方法
2016/12/26 Javascript
Angular.JS实现无限级的联动菜单(使用demo)
2017/02/08 Javascript
JS表单验证方法实例小结【电话、身份证号、Email、中文、特殊字符、身份证号等】
2017/02/14 Javascript
微信小程序 聊天室简单实现
2017/04/19 Javascript
JS中cookie的使用及缺点讲解
2017/05/13 Javascript
基于Require.js使用方法(总结)
2017/10/26 Javascript
对Vue.js之事件的绑定(v-on: 或者 @ )详解
2018/09/15 Javascript
vue-router懒加载速度缓慢问题及解决方法
2018/11/25 Javascript
ng-zorro-antd 入门初体验
2018/12/03 Javascript
vue本地打开build后生成的dist文件夹index.html问题
2019/09/04 Javascript
如何基于filter实现网站整体变灰功能
2020/04/17 Javascript
vue实现选中效果
2020/10/07 Javascript
[01:28:24]NAVI vs VG Supermajor 败者组 BO3 第三场 6.5
2018/06/06 DOTA
Python学习小技巧之列表项的排序
2017/05/20 Python
pandas创建新Dataframe并添加多行的实例
2018/04/08 Python
python实现LBP方法提取图像纹理特征实现分类的步骤
2019/07/11 Python
Python定时发送天气预报邮件代码实例
2019/09/09 Python
Css3圆角边框制作代码
2015/11/18 HTML / CSS
英国电子产品购物网站:Tech in the basket
2019/11/08 全球购物
个人职业生涯规划书1500字
2013/12/31 职场文书
2014年文学毕业生自我鉴定
2014/04/23 职场文书
旅游局领导班子“四风”问题对照检查材料思想汇报
2014/09/29 职场文书
二手车交易协议书标准版
2014/11/16 职场文书
公司致全体员工的感谢信
2019/06/24 职场文书