Python编程super应用场景及示例解析


Posted in Python onOctober 05, 2021

一、什么是super

1.super也是一个类,是的。他不是一个方法也不是一个内置的关键字。

class A:
    pass
print(type(super(A)))

输出结果

<class 'super'>

直接通过查看super的源码也可以看出它是一个类

Python编程super应用场景及示例解析

另外,网上很多文章讲解super就是用来调用父类方法的,这也是一个错误的观点!

假如我们有下面这样一个例子:

class A:
    def __init__(self):
        print("A")
class B(A):
    def __init__(self):
        print("B")
        super().__init__()
class C(A):
    def __init__(self):
        print("C")
        super().__init__()
class D(B, C):
    def __init__(self):
        print("D")
        super().__init__()
D()

如果按照“super就是用来调用父类的方法的”这样的理解来看,那上述代码的执行的过程应该为:

print("D")—【调用super会先后执行B和C】—先执行B:print("B")—【调用super执行A】—

print("A")—【调用super会先后执行B和C】—后执行C:print("C")—【调用super执行A】—

print("A")

执行结果理论应该为:D B A C A

但实际情况却不是这样的!

实际执行结果

D
B
C
A

所以说“super就是用来调用父类的方法的”这个说法是错误的!

实际上super的调用是遵循Python的【MRO(方法解析顺序)】来执行的,在Python3中,MRO是基于C3算法来实现的。

关于MRO和C3算法的讲解可以参考这篇文章http://kaiyuan.me/2016/04/27/C3_linearization/

三、super的常用使用场景

1.假如我们继承的多个父类有同名的方法,可以使用super来指定使用哪个父类的方法

class A:
    def test(self):
        print('A')
class B:
    def test(self):
        print('B')
class C(A, B):
    def __init__(self):
        super().test()  # 调用A类中的test方法
        super(C, self).test()  # 调用A类中的test方法
        super(A, self).test()  # 调用B类中的test方法    
        
C()

输出结果

A
A
B

2.当我们在子类中使用父类的一个方法并且想对其做一定扩展又不想完全重写,那么使用super()就可以实现方法的增量修改:

举一个例子,如果我们想把list中的append的方法改为中文添加应该怎么做呢?

并且python中list调用append方法是没有返回值的,我们想在添加元素操作成功后加一个返回值返回成功又该如何操作呢?

首先看通过调用原来的list的执行结果

a=list()
res=a.append(1)
print(res)

输出结果

None

可以看到调用append方法后返回的值为None

现在我们通过super进行重写,让其具有返回值并可以直接通过中文来调用append:

class 列表(list):
    def 添加(self, *args, **kwargs):
        super().append(*args, **kwargs)
        return "添加成功"

x = 列表()
res = x.添加(1)
print(res)
print(x)

输出结果

添加成功
[1]

super实际上还是很常用的,比如在restfremework中,需要重写其响应结果的Response信息的时候,除了通过django的中间件实现,也可以使用super重写其dispatch来实现。

以上就是Python编程super应用场景及示例解析的详细内容,更多关于Python编程super应用的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python正则表达式re之compile函数解析
Oct 25 Python
Python 内置函数memoryview(obj)的具体用法
Nov 23 Python
使用实现XlsxWriter创建Excel文件并编辑
May 04 Python
python 数字类型和字符串类型的相互转换实例
Jul 17 Python
pytorch中tensor的合并与截取方法
Jul 26 Python
python最小生成树kruskal与prim算法详解
Jan 17 Python
python3 tkinter实现点击一个按钮跳出另一个窗口的方法
Jun 13 Python
opencv3/python 鼠标响应操作详解
Dec 11 Python
Pyorch之numpy与torch之间相互转换方式
Dec 31 Python
tensorflow保持每次训练结果一致的简单实现
Feb 17 Python
python爬虫分布式获取数据的实例方法
Nov 26 Python
python用opencv 图像傅里叶变换
Jan 04 Python
Python编程源码报错解决方法总结经验分享
Oct 05 #Python
Python编程根据字典列表相同键的值进行合并
Oct 05 #Python
python编程简单几行代码实现视频转换Gif示例
用 Python 定义 Schema 并生成 Parquet 文件详情
Sep 25 #Python
使用pipenv管理python虚拟环境的全过程
Sep 25 #Python
Django实现WebSocket在线聊天室功能(channels库)
Sep 25 #Python
Python天气语音播报小助手
You might like
PHP判断表单复选框选中状态完整例子
2014/06/24 PHP
PHP回溯法解决0-1背包问题实例分析
2015/03/23 PHP
PHP使用stream_context_create()模拟POST/GET请求的方法
2016/04/02 PHP
PHP使用FFmpeg获取视频播放总时长与码率等信息
2016/09/13 PHP
php 截取中英文混合字符串的方法
2018/05/31 PHP
JavaScript Array扩展实现代码
2009/10/14 Javascript
十分钟打造AutoComplete自动完成效果代码
2009/12/26 Javascript
一个js的tab切换效果代码[代码分离]
2010/04/11 Javascript
情人节专属 纯js脚本1k大小的3D玫瑰效果
2012/02/11 Javascript
javascript中的括号()用法小结
2014/04/14 Javascript
JavaScript Array对象扩展indexOf()方法
2014/05/09 Javascript
浅析JavaScript中的事件机制
2015/06/04 Javascript
Bootstrap每天必学之级联下拉菜单
2016/03/27 Javascript
AngularJS  自定义指令详解及实例代码
2016/09/14 Javascript
通过bootstrap全面学习less
2016/11/09 Javascript
vuejs2.0实现一个简单的分页示例
2017/02/22 Javascript
Vue计算属性的学习笔记
2017/03/22 Javascript
ECMAScript6--解构
2017/03/30 Javascript
前端图片懒加载(lazyload)的实现方法(提高用户体验)
2017/08/21 Javascript
微信小程序Echarts图表组件使用方法详解
2019/06/25 Javascript
node.js处理前端提交的GET请求
2019/08/30 Javascript
[01:03:41]完美世界DOTA2联赛PWL S3 DLG vs Phoenix 第一场 12.17
2020/12/19 DOTA
Python中一些自然语言工具的使用的入门教程
2015/04/13 Python
Python网站验证码识别
2016/01/25 Python
Python 一句话生成字母表的方法
2019/01/02 Python
如何利用Anaconda配置简单的Python环境
2019/06/24 Python
师范毕业生求职自荐信
2013/09/25 职场文书
怎样写留学自荐信
2013/11/11 职场文书
最美家庭活动方案
2014/08/31 职场文书
国家税务局干部作风整顿整改措施
2014/09/18 职场文书
学校领导班子四风问题整改意见
2014/10/02 职场文书
涉外离婚协议书怎么写
2014/11/20 职场文书
长江三峡导游词
2015/01/31 职场文书
学期个人自我总结
2015/02/13 职场文书
《坐井观天》教学反思
2016/02/18 职场文书
检讨书范文
2019/04/16 职场文书