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 相关文章推荐
pyv8学习python和javascript变量进行交互
Dec 04 Python
Python中用pycurl监控http响应时间脚本分享
Feb 02 Python
Python实现求最大公约数及判断素数的方法
May 26 Python
Python绘制七段数码管实例代码
Dec 20 Python
Python实现的随机森林算法与简单总结
Jan 30 Python
详解关于Django中ORM数据库迁移的配置
Oct 08 Python
Python 仅获取响应头, 不获取实体的实例
Aug 21 Python
python爬虫 2019中国好声音评论爬取过程解析
Aug 26 Python
Tensorflow累加的实现案例
Feb 05 Python
python环境下安装opencv库的方法
Mar 05 Python
Python tkinter之Bind(绑定事件)的使用示例
Feb 05 Python
Python下载商品数据并连接数据库且保存数据
Mar 31 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
绿山咖啡和蓝山咖啡
2021/03/04 新手入门
如何使用PHP批量去除文件UTF8 BOM信息
2013/08/05 PHP
CodeIgniter中使用cookie的三种方式详解
2014/07/18 PHP
跟我学Laravel之路由
2014/10/15 PHP
PHP中开启gzip压缩的2种方法
2015/01/31 PHP
PHP日期和时间函数的使用示例详解
2020/08/06 PHP
权威JavaScript 中的内存泄露模式
2007/08/13 Javascript
IE和firefox浏览器的event事件兼容性汇总
2009/12/06 Javascript
javascript+iframe 实现无刷新载入整页的代码
2010/03/17 Javascript
js获取某月的最后一天日期的简单实例
2013/06/22 Javascript
Js实现当前点击a标签变色突出显示其他a标签回复原色
2013/11/27 Javascript
浅析JavaScript中的delete运算符
2013/11/30 Javascript
jQuery实现提示密码强度的代码
2015/07/15 Javascript
浅析四种常见的Javascript声明循环变量的书写方式
2015/10/14 Javascript
javascript 删除数组元素和清空数组的简单方法
2017/02/24 Javascript
jquery.form.js异步提交表单详解
2017/04/25 jQuery
Vue配合iView实现省市二级联动的示例代码
2018/07/27 Javascript
JavaScript遍历数组的三种方法map、forEach与filter实例详解
2019/02/27 Javascript
layui自定义插件citySelect实现省市区三级联动选择
2019/07/26 Javascript
Vue-drag-resize 拖拽缩放插件的使用(简单示例)
2019/12/04 Javascript
js实现圆形显示鼠标单击位置
2020/02/11 Javascript
[03:39]DOTA2英雄梦之声_第05期_幽鬼
2014/06/23 DOTA
python中的闭包用法实例详解
2015/05/05 Python
Python面向对象之类和对象属性的增删改查操作示例
2018/12/14 Python
linux中如何使用python3获取ip地址
2019/07/15 Python
树莓派3 搭建 django 服务器的实例
2019/08/29 Python
Python实现Wordcloud生成词云图的示例
2020/03/30 Python
Python通用唯一标识符uuid模块使用案例
2020/09/10 Python
python中实现词云图的示例
2020/12/19 Python
HTML5之语义标签介绍
2016/07/07 HTML / CSS
Belvilla法国:休闲度假房屋出租
2020/10/03 全球购物
巴西购物网站:Onofre Agora
2020/06/08 全球购物
销售经理工作失职检讨书
2014/10/24 职场文书
小学毕业感言100字
2015/07/30 职场文书
手术室消毒隔离制度
2015/08/05 职场文书
CentOS8.4安装Redis6.2.6的详细过程
2021/11/20 Redis