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 相关文章推荐
Pyramid添加Middleware的方法实例
Nov 27 Python
python的格式化输出(format,%)实例详解
Jun 01 Python
python获取代码运行时间的实例代码
Jun 11 Python
Python中print和return的作用及区别解析
May 05 Python
python 猴子补丁(monkey patch)
Jun 26 Python
python 判断字符串中是否含有汉字或非汉字的实例
Jul 15 Python
Python实现Mysql数据统计及numpy统计函数
Jul 15 Python
Django实现简单网页弹出警告代码
Nov 15 Python
python图形开发GUI库pyqt5的详细使用方法及各控件的属性与方法
Feb 14 Python
Python实现RabbitMQ6种消息模型的示例代码
Mar 30 Python
解决pycharm debug时界面下方不出现step等按钮及变量值的问题
Jun 09 Python
详解Python 中的容器 collections
Aug 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安全性问题中的:Null 字符问题
2013/06/21 PHP
改写函数实现PHP二维/三维数组转字符串
2013/09/13 PHP
php模拟ping命令(php exec函数的使用方法)
2013/10/25 PHP
Thinkphp多文件上传实现方法
2014/10/31 PHP
thinkPHP5 ACL用户权限模块用法详解
2017/05/10 PHP
laravel 事件/监听器实例代码
2019/04/12 PHP
JS鼠标事件大全 推荐收藏
2011/11/01 Javascript
js 验证密码强弱的小例子
2013/03/21 Javascript
把input初始值不写value的具体实现方法
2013/07/04 Javascript
HTML页面滚动时获取离页面顶部的距离2种实现方法
2013/09/05 Javascript
jQuery实现监控页面所有ajax请求的方法
2015/12/10 Javascript
Bootstrap入门书籍之(五)导航条、分页导航
2016/02/17 Javascript
JavaScript实战之带收放动画效果的导航菜单
2016/08/16 Javascript
微信小程序学习笔记之文件上传、下载操作图文详解
2019/03/29 Javascript
layui的select联动实现代码
2019/09/28 Javascript
js实现转动骰子模型
2019/10/24 Javascript
原生微信小程序开发中 redux 的使用详解
2021/02/18 Javascript
python通过urllib2获取带有中文参数url内容的方法
2015/03/13 Python
python使用socket进行简单网络连接的方法
2015/04/29 Python
浅谈Django自定义模板标签template_tags的用处
2017/12/20 Python
简单实现python画圆功能
2018/01/25 Python
python的dataframe转换为多维矩阵的方法
2018/04/11 Python
selenium获取当前页面的url、源码、title的方法
2019/06/12 Python
Python进程,多进程,获取进程id,给子进程传递参数操作示例
2019/10/11 Python
python七种方法判断字符串是否包含子串
2020/08/18 Python
医学实习生自我鉴定
2013/12/12 职场文书
新入职员工的自我介绍演讲稿
2014/01/02 职场文书
国际经济与贸易专业大学生职业规划书
2014/03/01 职场文书
投资合作协议书范本
2014/04/17 职场文书
三八妇女节超市活动方案
2014/08/18 职场文书
检察机关个人对照检查材料
2014/09/15 职场文书
个人债务授权委托书范本
2014/10/05 职场文书
领导干部作风建设剖析材料
2014/10/11 职场文书
大学四年个人总结
2015/03/03 职场文书
2022新作动画《福星小子》释出宣传影片 加入内田真礼&宫野真守配音演出
2022/04/08 日漫
使用Python通过企业微信应用给企业成员发消息
2022/04/18 Python