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的Flask框架中web表单的教程
Apr 20 Python
Python编程中使用Pillow来处理图像的基础教程
Nov 20 Python
python音频处理用到的操作的示例代码
Oct 27 Python
高质量Python代码编写的5个优化技巧
Nov 16 Python
Python Numpy 数组的初始化和基本操作
Mar 13 Python
python使用tensorflow深度学习识别验证码
Apr 03 Python
Python datetime和unix时间戳之间相互转换的讲解
Apr 01 Python
python 利用pyttsx3文字转语音过程详解
Sep 25 Python
python实现按首字母分类查找功能
Oct 31 Python
浅谈python量化 双均线策略(金叉死叉)
Jun 03 Python
keras实现theano和tensorflow训练的模型相互转换
Jun 19 Python
python实现简易版学生成绩管理系统
Jun 22 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打造的tab选项卡效果代码(不用js)
2010/12/29 PHP
php数组函数序列之array_combine() - 数组合并函数使用说明
2011/10/29 PHP
PHP fastcgi模式上传大文件(大约有300多K)报错
2014/09/28 PHP
php常用字符串比较函数实例汇总
2014/11/24 PHP
php对关联数组循环遍历的实现方法
2015/03/13 PHP
PHP实现抓取迅雷VIP账号的方法
2015/07/30 PHP
20个非常棒的 jQuery 幻灯片插件和教程分享
2011/08/23 Javascript
学习从实践开始之jQuery插件开发 菜单插件开发
2012/05/03 Javascript
js实现页面转发功能示例代码
2013/08/05 Javascript
js触发select onchange事件的小技巧
2014/08/05 Javascript
纯JS实现旋转图片3D展示效果
2015/04/12 Javascript
Windows系统下使用Sublime搭建nodejs环境
2015/04/13 NodeJs
JavaScript实现阿拉伯数字和中文数字互相转换
2016/06/12 Javascript
js仿iphone秒表功能 计算平均数
2017/01/11 Javascript
解决Vue中mounted钩子函数获取节点高度出错问题
2018/05/18 Javascript
详解vue-cli官方脚手架配置
2018/07/20 Javascript
Vue 实例事件简单示例
2019/09/19 Javascript
原生JS实现多条件筛选
2020/08/19 Javascript
解决vue项目中出现Invalid Host header的问题
2020/11/17 Javascript
Linux CentOS Python开发环境搭建教程
2018/11/28 Python
python实现监控阿里云账户余额功能
2019/12/16 Python
python GUI库图形界面开发之PyQt5线程类QThread详细使用方法
2020/02/26 Python
python ImageDraw类实现几何图形的绘制与文字的绘制
2020/02/26 Python
python matplotlib库的基本使用
2020/09/23 Python
Pycharm中使用git进行合作开发的教程详解
2020/11/17 Python
澳大利亚墨水站Ink Station:墨水和碳粉打印机墨盒
2019/03/24 全球购物
印度手工编织服装和家居用品商店:Fabindi
2019/10/07 全球购物
标准导师推荐信(医学类)
2013/10/28 职场文书
优秀大学生的自我评价
2014/01/16 职场文书
上课睡觉检讨书
2014/01/28 职场文书
期末评语大全
2014/05/04 职场文书
2014年保安个人工作总结
2014/11/13 职场文书
毕业论文答辩稿范文
2015/06/23 职场文书
2015国庆节放假通知范文
2015/07/30 职场文书
详解TS数字分隔符和更严格的类属性检查
2021/05/06 Javascript
CSS 制作波浪效果的思路
2021/05/18 HTML / CSS