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图形绘制操作之正弦曲线实现方法分析
Dec 25 Python
python实现统计文本中单词出现的频率详解
May 20 Python
Pandas中resample方法详解
Jul 02 Python
python:按行读入,排序然后输出的方法
Jul 20 Python
浅析PEP570新语法: 只接受位置参数
Oct 15 Python
利用pandas将非数值数据转换成数值的方式
Dec 18 Python
在python中logger setlevel没有生效的解决
Feb 21 Python
详解Python的爬虫框架 Scrapy
Aug 03 Python
Python+OpenCV图像处理—— 色彩空间转换
Oct 22 Python
python的dict判断key是否存在的方法
Dec 09 Python
进行数据处理的6个 Python 代码块分享
Apr 06 Python
python热力图实现的完整实例
Jun 25 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
ThinkPHP实现将本地文件打包成zip下载
2014/06/26 PHP
经典PHP加密解密函数Authcode()修复版代码
2015/04/05 PHP
PHP实现的回溯算法示例
2017/08/15 PHP
PHP守护进程化在C和PHP环境下的实现
2017/11/21 PHP
JQuery文字列表向上滚动的代码
2013/11/13 Javascript
JS中判断null、undefined与NaN的方法
2014/03/26 Javascript
JQuery radio(单选按钮)操作方法汇总
2015/04/15 Javascript
Javascript中arguments用法实例分析
2015/06/13 Javascript
javascript倒计时效果实现
2015/11/12 Javascript
使用Jasmine和Karma对AngularJS页面程序进行测试
2016/03/05 Javascript
几行js代码实现自适应
2017/02/24 Javascript
Angular之指令Directive用法详解
2017/03/01 Javascript
ionic实现底部分享功能
2017/05/11 Javascript
使用vue和datatables进行表格的服务器端分页实例代码
2017/06/07 Javascript
jquery中有哪些api jQuery主要API
2017/11/20 jQuery
如何去除vue项目中的#及其ie9兼容性
2018/01/11 Javascript
Vue+axios实现统一接口管理的方法
2018/07/23 Javascript
如何基于vue-cli3.0构建功能完善的移动端架子
2019/04/24 Javascript
vue子组件改变父组件传递的prop值通过sync实现数据双向绑定(DEMO)
2020/02/01 Javascript
如何配置vue.config.js 处理static文件夹下的静态文件
2020/06/19 Javascript
[02:36]DOTA2英雄基础教程 一击致命幻影刺客
2013/12/06 DOTA
[01:03:54]Liquid vs IG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
python中的字典操作及字典函数
2018/01/03 Python
TensorFlow实现RNN循环神经网络
2018/02/28 Python
Android Q之气泡弹窗的实现示例
2020/06/23 Python
python爬虫利用selenium实现自动翻页爬取某鱼数据的思路详解
2020/12/22 Python
欧缇丽英国官方网站:Caudalie英国
2016/08/17 全球购物
牵手50台湾:专为黄金岁月的单身人士而设的交友网站
2021/02/18 全球购物
解除劳动合同协议书范本
2014/04/14 职场文书
交通文明倡议书
2014/05/16 职场文书
博士生专家推荐信
2014/09/26 职场文书
土地转让协议书
2014/09/27 职场文书
2014社区健康教育工作总结
2014/12/16 职场文书
Pandas加速代码之避免使用for循环
2021/05/30 Python
redis requires ruby version2.2.2的解决方案
2021/07/15 Redis
讲解Python实例练习逆序输出字符串
2022/05/06 Python