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实现方法
Nov 18 Python
进一步探究Python的装饰器的运用
May 05 Python
Python3.6简单操作Mysql数据库
Sep 12 Python
python opencv 图像尺寸变换方法
Apr 02 Python
python3中os.path模块下常用的用法总结【推荐】
Sep 16 Python
python多进程使用及线程池的使用方法代码详解
Oct 24 Python
python发送多人邮件没有展示收件人问题的解决方法
Jun 21 Python
python+pygame实现坦克大战
Sep 10 Python
python wxpython 实现界面跳转功能
Dec 17 Python
python实现指定ip端口扫描方式
Dec 17 Python
浅谈python print(xx, flush = True) 全网最清晰的解释
Feb 21 Python
python DataFrame中stack()方法、unstack()方法和pivot()方法浅析
Apr 06 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+mysql来做一个功能强大的在线计算器
2010/10/12 PHP
php 面试碰到过的问题 在此做下记录
2011/06/09 PHP
php使用QueryList轻松采集js动态渲染页面方法
2018/09/11 PHP
XAMPP升级PHP版本实现步骤解析
2020/09/04 PHP
jQuery 学习 几种常用方法
2009/06/11 Javascript
基于JQuery的cookie插件
2010/04/07 Javascript
js location.replace与location.reload的区别
2010/09/08 Javascript
验证码按回车不变解决方法
2013/03/29 Javascript
javascript去除字符串中所有标点符号和提取纯文本的正则
2014/06/07 Javascript
javascript轻量级模板引擎juicer使用指南
2014/06/22 Javascript
利用jquery操作Radio方法小结
2014/10/20 Javascript
Node.js与Sails redis组件的使用教程
2017/02/14 Javascript
详解Vue2.0之去掉组件click事件的native修饰
2017/04/20 Javascript
jQuery实现一个简单的验证码功能
2017/06/26 jQuery
Angular自定义组件实现数据双向数据绑定的实例
2017/12/11 Javascript
JS Object.preventExtensions(),Object.seal()与Object.freeze()用法实例分析
2018/08/25 Javascript
在Webpack中用url-loader处理图片和字体的问题
2020/04/28 Javascript
[55:25]VGJ.T vs Optic Supermajor小组赛D组 BO3 第三场 6.3
2018/06/04 DOTA
[02:55]2018DOTA2国际邀请赛勇士令状不朽珍藏Ⅲ饰品一览
2018/08/01 DOTA
举例讲解Python的Tornado框架实现数据可视化的教程
2015/05/02 Python
Python字符串逆序输出的实例讲解
2019/02/16 Python
浅谈对pytroch中torch.autograd.backward的思考
2019/12/27 Python
使用OpenCV获取图片连通域数量,并用不同颜色标记函
2020/06/04 Python
基于Tensorflow的MNIST手写数字识别分类
2020/06/17 Python
使用CSS3来匹配横屏竖屏的简单方法
2015/08/04 HTML / CSS
HomeAway英国:全球领先的度假租赁在线市场
2020/02/03 全球购物
卫校中专生个人自我评价
2013/09/19 职场文书
最新奶茶店创业计划书
2014/01/25 职场文书
大学生标准自荐书
2014/06/15 职场文书
2014年流动人口工作总结
2014/11/26 职场文书
卢旺达饭店观后感
2015/06/05 职场文书
电工生产实习心得体会
2016/01/22 职场文书
毕业生的自我鉴定表范文
2019/05/16 职场文书
Nginx + consul + upsync 完成动态负载均衡的方法详解
2021/03/31 Servers
golang特有程序结构入门教程
2021/06/02 Python
Python如何将list中的string转换为int
2022/07/15 Ruby