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中自定义函数的可变参数的使用及注意点
Jun 21 Python
Python爬虫番外篇之Cookie和Session详解
Dec 27 Python
Django中STATIC_ROOT和STATIC_URL及STATICFILES_DIRS浅析
May 08 Python
python获取命令行输入参数列表的实例代码
Jun 23 Python
详解python项目实战:模拟登陆CSDN
Apr 04 Python
Pandas 重塑(stack)和轴向旋转(pivot)的实现
Jul 22 Python
Django ORM 自定义 char 类型字段解析
Aug 09 Python
Python urllib2运行过程原理解析
Jun 04 Python
Python数据可视化实现多种图例代码详解
Jul 14 Python
如何解决flask修改静态资源后缓存文件不能及时更改问题
Aug 02 Python
Python机器学习工具scikit-learn的使用笔记
Jan 28 Python
一文搞懂Python Sklearn库使用
Aug 23 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中文件上传的安全问题
2006/10/09 PHP
php导出csv数据在浏览器中输出提供下载或保存到文件的示例
2014/04/24 PHP
PHP filesize函数用法浅析
2019/02/15 PHP
Jquery+CSS3实现一款简洁大气带滑动效果的弹出层
2013/05/15 Javascript
js浮点数保留两位小数点示例代码(四舍五入)
2013/12/26 Javascript
ExtJS4 表格的嵌套 rowExpander应用
2014/05/02 Javascript
浅析Node.js中使用依赖注入的相关问题及解决方法
2015/06/24 Javascript
jquery实现TAB选项卡鼠标经过带延迟效果的方法
2015/07/27 Javascript
Js制作点击输入框时默认文字消失的效果
2015/09/05 Javascript
Ionic实现页面下拉刷新(ion-refresher)功能代码
2016/06/03 Javascript
layer弹出层中H5播放器全屏出错的解决方法
2017/02/21 Javascript
Vue 创建组件的两种方法小结(必看)
2018/02/23 Javascript
JavaScript实现五子棋游戏的方法详解
2019/07/08 Javascript
Vue数据双向绑定底层实现原理
2019/11/22 Javascript
PHP魔术方法__ISSET、__UNSET使用实例
2014/11/25 Python
浅谈Python实现2种文件复制的方法
2018/01/19 Python
Python3.5 创建文件的简单实例
2018/04/26 Python
Python基本数据结构之字典类型dict用法分析
2019/06/08 Python
python实现最大子序和(分治+动态规划)
2019/07/05 Python
python几种常用功能实现代码实例
2019/12/25 Python
TensorFlow tensor的拼接实例
2020/01/19 Python
Pytest mark使用实例及原理解析
2020/02/22 Python
python用opencv 图像傅里叶变换
2021/01/04 Python
HTML5 在canvas中绘制文本附效果图
2014/06/23 HTML / CSS
英国领先的互联网葡萄酒礼品商:Vintage Wine & Port
2019/05/24 全球购物
javascript实现用户必须勾选协议实例讲解
2021/03/24 Javascript
小学教师办公室制度
2014/02/03 职场文书
公司节能减排方案
2014/05/16 职场文书
党员群众路线剖析材料
2014/10/08 职场文书
涉外离婚协议书怎么写
2014/11/20 职场文书
2014年学校工会工作总结
2014/12/06 职场文书
2016年大学自主招生自荐信范文
2015/03/24 职场文书
2015年秋季小学开学典礼主持词
2015/07/16 职场文书
导游词之山西祁县乔家大院
2019/10/14 职场文书
MySQL系列之十五 MySQL常用配置和性能压力测试
2021/07/02 MySQL
Arthas排查Kubernetes中应用频繁挂掉重启异常
2022/02/28 MySQL