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的Tornado框架实现数据可视化的教程
May 02 Python
python用Pygal如何生成漂亮的SVG图像详解
Feb 10 Python
Python实现Youku视频批量下载功能
Mar 14 Python
python版opencv摄像头人脸实时检测方法
Aug 03 Python
使用Python实现租车计费系统的两种方法
Sep 29 Python
Python人脸识别第三方库face_recognition接口说明文档
May 03 Python
详解用python写网络爬虫-爬取新浪微博评论
May 10 Python
python如何实现复制目录到指定目录
Feb 13 Python
pyCharm 设置调试输出窗口中文显示方式(字符码转换)
Jun 09 Python
Python生成pdf目录书签的实例方法
Oct 29 Python
python 基于PYMYSQL使用MYSQL数据库
Dec 24 Python
PyTorch device与cuda.device用法
Apr 03 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/06/30 PHP
阿里云Win2016安装Apache和PHP环境图文教程
2018/03/11 PHP
php实现微信支付之企业付款
2018/05/30 PHP
php源码的安装方法和实例
2019/09/26 PHP
在laravel中实现事务回滚的方法
2019/10/10 PHP
HR vs CL BO3 第二场 2.13
2021/03/10 DOTA
给网站上的广告“加速”显示的方法
2007/04/08 Javascript
flash javascript之间的通讯方法小结
2008/12/20 Javascript
js当一个变量为函数时 应该注意的一点细节小结
2011/12/29 Javascript
浅析JQuery UI Dialog的样式设置问题
2013/12/18 Javascript
jquery取子节点及当前节点属性值的方法
2014/09/09 Javascript
js去除浏览器默认底图的方法
2015/06/08 Javascript
location.hash保存页面状态的技巧
2016/04/28 Javascript
简单实现jquery焦点图
2016/12/12 Javascript
Vue结合原生js实现自定义组件自动生成示例
2017/01/21 Javascript
jQuery中each方法的使用详解
2018/03/18 jQuery
解决vue-cli3 使用子目录部署问题
2018/07/19 Javascript
Vue学习笔记之计算属性与侦听器用法
2019/12/07 Javascript
vue实现数据控制视图的原理解析
2020/01/07 Javascript
JS实现简易计算器
2020/02/14 Javascript
Python自定义scrapy中间模块避免重复采集的方法
2015/04/07 Python
Python多进程并发(multiprocessing)用法实例详解
2015/06/02 Python
pycharm远程调试openstack的图文教程
2017/11/21 Python
python中ASCII码和字符的转换方法
2018/07/09 Python
django实现将修改好的新模型写入数据库
2020/03/31 Python
python如何删除列为空的行
2020/07/17 Python
HTML5 placeholder属性详解
2016/06/22 HTML / CSS
一款html5 canvas实现的图片玻璃碎片特效
2014/09/11 HTML / CSS
50道外企软件测试面试题
2014/08/18 面试题
人口与计划生育责任书
2015/05/09 职场文书
昆虫记读书笔记
2015/06/26 职场文书
迎新生晚会主持词
2015/06/30 职场文书
导游词之无锡梅园
2019/11/28 职场文书
【海涛教你打DOTA】黑鸟第一视角解说
2022/04/01 DOTA
JavaScript设计模式之原型模式详情
2022/06/21 Javascript
如何用H5实现好玩的2048小游戏
2022/07/23 HTML / CSS