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 相关文章推荐
将Django框架和遗留的Web应用集成的方法
Jul 24 Python
Python使用base64模块进行二进制数据编码详解
Jan 11 Python
Django中使用celery完成异步任务的示例代码
Jan 23 Python
Python(TensorFlow框架)实现手写数字识别系统的方法
May 29 Python
解决sublime+python3无法输出中文的问题
Dec 12 Python
Python后台开发Django会话控制的实现
Apr 15 Python
Python利用pandas处理Excel数据的应用详解
Jun 18 Python
Python实现钉钉订阅消息功能
Jan 14 Python
tensorflow实现读取模型中保存的值 tf.train.NewCheckpointReader
Feb 10 Python
Python通过文本和图片生成词云图
May 21 Python
django haystack实现全文检索的示例代码
Jun 24 Python
Python实现仓库管理系统
May 30 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/11/29 PHP
php运行时动态创建函数的方法
2015/03/16 PHP
javascript下查找父节点的简单方法
2007/08/13 Javascript
JavaScript的类型简单说明
2010/09/03 Javascript
jquery定时滑出可最小化的底部提示层特效代码
2013/10/02 Javascript
Js实现滚动变色的文字效果
2014/06/16 Javascript
javascript中tostring()和valueof()的用法及两者的区别
2015/11/16 Javascript
jQuery实现的AJAX简单弹出层效果代码
2015/11/26 Javascript
javascript基本算法汇总
2016/03/09 Javascript
JS如何判断json是否为空
2016/07/06 Javascript
String字符串截取的四种方式总结
2016/11/28 Javascript
jQuery控制元素隐藏和显示
2017/03/03 Javascript
vue通过style或者class改变样式的实例代码
2018/10/30 Javascript
微信小程序实现登录注册tab切换效果
2020/12/29 Javascript
小程序接口的promise化的实现方法
2019/12/11 Javascript
vue微信分享插件使用方法详解
2020/02/18 Javascript
JavaScript实现手风琴效果
2021/02/18 Javascript
[01:12]快闪回顾DOTA2亚洲邀请赛(DAC) 静候2018新征程开启
2018/03/11 DOTA
python回调函数的使用方法
2014/01/23 Python
python进程管理工具supervisor使用实例
2014/09/17 Python
理解生产者消费者模型及在Python编程中的运用实例
2016/06/26 Python
Python中支持向量机SVM的使用方法详解
2017/12/26 Python
python书籍信息爬虫实例
2018/03/19 Python
python实现zabbix发送短信脚本
2018/09/17 Python
python求绝对值的三种方法小结
2019/12/04 Python
Python实现像awk一样分割字符串
2020/09/15 Python
世界上最大的冷却器制造商:Igloo Coolers
2019/07/23 全球购物
绘画设计学生的个人自我评价
2013/09/20 职场文书
出纳员岗位职责风险
2014/03/06 职场文书
社区科普工作方案
2014/06/03 职场文书
文员求职信
2014/07/15 职场文书
2014年图书馆个人工作总结
2014/12/18 职场文书
2019年度开业庆典祝福语大全!
2019/07/05 职场文书
2019年最新借条范本!
2019/07/08 职场文书
Python实战之实现简易的学生选课系统
2021/05/25 Python
Golang表示枚举类型的详细讲解
2021/09/04 Golang