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程序与MySQL的教程
Apr 29 Python
Python中使用items()方法返回字典元素对的教程
May 21 Python
Python使用SocketServer模块编写基本服务器程序的教程
Jul 12 Python
python类中super()和__init__()的区别
Oct 18 Python
windows下安装Python和pip终极图文教程
Mar 05 Python
Python使用wget实现下载网络文件功能示例
May 31 Python
python 自定义异常和异常捕捉的方法
Oct 18 Python
python 定义n个变量方法 (变量声明自动化)
Nov 10 Python
pandas 对日期类型数据的处理方法详解
Aug 08 Python
Python MongoDB 插入数据时已存在则不执行,不存在则插入的解决方法
Sep 24 Python
使用Python的Turtle库绘制森林的实例
Dec 18 Python
anaconda3安装及jupyter环境配置全教程
Aug 24 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连接MSSQL时nvarchar字段长度被截断为255的解决方法
2014/12/25 PHP
PHP单例模式模拟Java Bean实现方法示例
2018/12/07 PHP
PHP实现随机发扑克牌
2020/04/22 PHP
jQuery 表单验证扩展代码(二)
2010/10/20 Javascript
Javascript实现DIV滚动自动滚动到底部的代码
2012/03/01 Javascript
jquery移除button的inline onclick事件(已测试及兼容浏览器)
2013/01/25 Javascript
javascript拖拽上传类库DropzoneJS使用方法
2013/12/05 Javascript
Node.js中require的工作原理浅析
2014/06/24 Javascript
JavaScript实现的内存数据库LokiJS介绍和入门实例
2014/11/17 Javascript
HTML5 Shiv完美解决IE(IE6/IE7/IE8)不兼容HTML5标签的方法
2015/11/25 Javascript
基于JavaScript实现弹出框效果
2016/02/19 Javascript
为JQuery EasyUI 表单组件增加焦点切换功能的方法
2017/04/13 jQuery
详解webpack 入门总结和实践(按需异步加载,css单独打包,生成多个入口文件)
2017/06/20 Javascript
JQuery实现table中tr上移下移的示例(超简单)
2018/01/08 jQuery
JS实现的文件拖拽上传功能示例
2018/05/21 Javascript
三步实现ionic3点击退出app程序
2019/09/17 Javascript
js实现经典贪吃蛇小游戏
2020/03/19 Javascript
[36:29]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 LGD vs TNC
2018/04/02 DOTA
Python中dictionary items()系列函数的用法实例
2014/08/21 Python
对Python字符串中的换行符和制表符介绍
2018/05/03 Python
Python小工具之消耗系统指定大小内存的方法
2018/12/03 Python
利用pyuic5将ui文件转换为py文件的方法
2019/06/19 Python
详解python中的模块及包导入
2019/08/30 Python
django ajax发送post请求的两种方法
2020/01/05 Python
Tensorflow 模型转换 .pb convert to .lite实例
2020/02/12 Python
解决python DataFrame 打印结果不换行问题
2020/04/09 Python
通过Python实现Payload分离免杀过程详解
2020/07/13 Python
django前端页面下拉选择框默认值设置方式
2020/08/09 Python
Ubuntu配置Pytorch on Graph (PoG)环境过程图解
2020/11/19 Python
德国网上宠物店:Zoobio
2018/05/23 全球购物
应聘美工求职信
2013/11/07 职场文书
暑假家长评语大全
2014/04/17 职场文书
临时用工协议书范本
2014/10/29 职场文书
计算机专业自荐信范文
2015/03/26 职场文书
高一军训口号
2015/12/25 职场文书
Matplotlib绘制条形图的方法你知道吗
2022/03/21 Python