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爬虫框架Scrapy安装使用步骤
Apr 01 Python
Python Web框架Flask中使用新浪SAE云存储实例
Feb 08 Python
python抓取网页中图片并保存到本地
Dec 01 Python
pycharm安装图文教程
May 02 Python
python队列通信:rabbitMQ的使用(实例讲解)
Dec 22 Python
Python从Excel中读取日期一列的方法
Nov 28 Python
Python动态赋值的陷阱知识点总结
Mar 17 Python
Mac安装python3的方法步骤
Aug 09 Python
pyhton中__pycache__文件夹的产生与作用详解
Nov 24 Python
python 实现视频 图像帧提取
Dec 10 Python
Pandas 稀疏数据结构的实现
Jul 25 Python
Python 统计序列中元素的出现频度
Apr 26 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+mysql写的简单留言本实例代码
2008/07/25 PHP
Windows 下的 PHP-PEAR 安装方法
2010/11/20 PHP
第四章 php数学运算
2011/12/30 PHP
浅析php学习的路线图
2013/07/10 PHP
php中文字符串截取多种方法汇总
2016/10/06 PHP
php操作mongodb封装类与用法实例
2018/09/01 PHP
PHP实现二维数组按照指定的字段进行排序算法示例
2019/04/23 PHP
YII框架实现自定义第三方扩展操作示例
2019/04/26 PHP
不能再简单的无闪刷新验证码原理很简单
2007/11/05 Javascript
滚动条变色 隐藏滚动条与双击网页自动滚屏显示代码
2009/12/28 Javascript
jquery 新浪网易的评论块制作
2010/07/01 Javascript
浅析IE10兼容性问题(frameset的cols属性)
2014/01/03 Javascript
减少访问DOM的次数提升javascript性能
2014/02/24 Javascript
jQuery滚动条插件nanoscroller使用指南
2015/04/21 Javascript
基于jQuery实现的菜单切换效果
2015/10/16 Javascript
AngularJS ng-repeat指令中使用track by子语句解决重复数据遍历错误问题
2017/01/21 Javascript
JS html时钟制作代码分享
2017/03/03 Javascript
Node.js中.pfx后缀文件的处理方法
2017/03/10 Javascript
JS实现移动端判断上拉和下滑功能
2017/08/07 Javascript
JavaScript判断日期时间差的实例代码
2018/03/01 Javascript
浅谈react性能优化的方法
2018/09/05 Javascript
解决vue字符串换行问题(绝对管用)
2020/08/06 Javascript
[57:09]DOTA2-DPC中国联赛 正赛 Phoenix vs Dynasty BO3 第一场 1月26日
2021/03/11 DOTA
php使用递归与迭代实现快速排序示例
2014/01/23 Python
python利用正则表达式提取字符串
2016/12/08 Python
用Python登录好友QQ空间点赞的示例代码
2017/11/04 Python
python如何将多个PDF进行合并
2019/08/13 Python
python 实现二维字典的键值合并等函数
2019/12/06 Python
python环境下安装opencv库的方法
2020/03/05 Python
100%植物性、有机、即食餐:Sakara Life
2018/10/25 全球购物
同学聚会欢迎辞
2014/01/14 职场文书
初一新生军训方案
2014/05/22 职场文书
2015年推普周活动方案
2015/05/06 职场文书
JS数组方法some、every和find的使用详情
2021/10/05 Javascript
python 详解turtle画爱心代码
2022/02/15 Python
Windows server 2012 配置Telnet以及用法详解
2022/04/28 Servers