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 20 Python
Python基本数据类型详细介绍
Mar 11 Python
Python实现的批量下载RFC文档
Mar 10 Python
Python中在脚本中引用其他文件函数的实现方法
Jun 23 Python
Python随机数用法实例详解【基于random模块】
Apr 18 Python
python文件名和文件路径操作实例
Sep 29 Python
python导出hive数据表的schema实例代码
Jan 22 Python
Python with语句上下文管理器两种实现方法分析
Feb 09 Python
浅谈dataframe中更改列属性的方法
Jul 10 Python
python消费kafka数据批量插入到es的方法
Dec 27 Python
python实现发送form-data数据的方法详解
Sep 27 Python
详解python statistics模块及函数用法
Oct 27 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
Win9x/ME下Apache+PHP安装配置
2006/10/09 PHP
PHP程序61条面向对象分析设计的经验小结
2008/11/12 PHP
PHP关联数组的10个操作技巧
2013/01/21 PHP
php使用function_exists判断函数可用的方法
2014/11/19 PHP
php微信开发接入
2016/08/27 PHP
Yii2.0框架实现带分页的多条件搜索功能示例
2019/02/20 PHP
IE6弹出“已终止操作”的解决办法
2010/11/27 Javascript
Flexigrid在IE下不显示数据的处理的解决方法
2013/10/24 Javascript
简体中文转换繁体中文(实现代码)
2013/12/25 Javascript
原生javascript实现简单的datagrid数据表格
2015/01/02 Javascript
jquery代码实现多选、不同分享功能
2015/07/31 Javascript
RequireJS多页面应用实例分析
2016/06/29 Javascript
关于JS变量和作用域详解
2016/07/28 Javascript
用JS动态设置CSS样式常见方法小结(推荐)
2016/11/10 Javascript
jQuery实现动态文字搜索功能
2017/01/05 Javascript
原生JS实现幻灯片
2017/02/22 Javascript
JavaScript中的普通函数和箭头函数的区别和用法详解
2017/03/21 Javascript
基于JavaScript实现微信抢红包功能
2017/07/20 Javascript
js中的闭包学习心得
2018/02/06 Javascript
vue中动态设置meta标签和title标签的方法
2018/07/11 Javascript
JS+canvas画布实现炫酷的旋转星空效果示例
2019/02/13 Javascript
vue 自动化路由实现代码
2019/09/03 Javascript
node.js 如何监视文件变化
2020/09/01 Javascript
js操作两个json数组合并、去重,以及删除某一项元素
2020/09/22 Javascript
Python程序设计入门(1)基本语法简介
2014/06/13 Python
python在windows和linux下获得本机本地ip地址方法小结
2015/03/20 Python
python中reduce()函数的使用方法示例
2017/09/29 Python
python实现可变变量名方法详解
2019/07/01 Python
Philosophy美国官网:美国美容品牌
2016/08/15 全球购物
英国可持续奢侈品包包品牌:Elvis & Kresse
2018/08/05 全球购物
Prototype如何实现页面局部定时刷新
2013/08/06 面试题
师范生实习个人的自我评价
2013/09/28 职场文书
社区安全检查制度
2014/02/03 职场文书
计算机大学生职业生涯规划书范文
2014/02/19 职场文书
置业顾问岗位职责
2014/03/02 职场文书
熟背这些句子,让您的英语口语突飞猛进(135句)
2019/09/06 职场文书