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字符串替换示例
Apr 24 Python
Python中的Numeric包和Numarray包使用教程
Apr 13 Python
Python的Django框架中TEMPLATES项的设置教程
May 29 Python
python采用django框架实现支付宝即时到帐接口
May 17 Python
浅谈配置OpenCV3 + Python3的简易方法(macOS)
Apr 02 Python
python3安装pip3(install pip3 for python 3.x)
Apr 03 Python
Python 脚本获取ES 存储容量的实例
Dec 27 Python
Python使用字典的嵌套功能详解
Feb 27 Python
Python 将 QQ 好友头像生成祝福语的实现代码
May 03 Python
基于Python的一个自动录入表格的小程序
Aug 05 Python
Python3 使用pip安装git并获取Yahoo金融数据的操作
Apr 08 Python
pandas取dataframe特定行列的实现方法
May 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 cookies中删除的一般赋值方法
2011/05/07 PHP
PHP实现压缩图片尺寸并转为jpg格式的方法示例
2018/05/10 PHP
解决Laravel 使用insert插入数据,字段created_at为0000的问题
2019/10/11 PHP
XP折叠菜单&amp;仿QQ2006菜单
2006/12/16 Javascript
理解Javascript_05_原型继承原理
2010/10/13 Javascript
Javascript中克隆一个数组的实现代码
2013/12/06 Javascript
js 与 php 通过json数据进行通讯示例
2014/03/26 Javascript
Javascript显示和隐藏ul列表的方法
2015/07/15 Javascript
JavaScript实现获得所有兄弟节点的方法
2015/07/23 Javascript
AngularJS中isolate scope的用法分析
2016/11/22 Javascript
AngularJS实现用户登录状态判断的方法(Model添加拦截过滤器,路由增加限制)
2016/12/12 Javascript
js下拉菜单生成器dropMenu使用方法详解
2017/08/01 Javascript
node文件批量重命名的方法示例
2017/10/23 Javascript
js登录滑动验证的实现(不滑动无法登陆)
2018/01/03 Javascript
vue自定义一个v-model的实现代码
2018/06/21 Javascript
微信小程序自定义顶部组件customHeader的示例代码
2020/06/03 Javascript
python 实现一个贴吧图片爬虫的示例
2017/10/12 Python
python sqlite的Row对象操作示例
2019/09/11 Python
详解python tkinter模块安装过程
2020/01/06 Python
Python实现手绘图效果实例分享
2020/07/22 Python
让IE6、IE7、IE8支持CSS3的脚本
2010/07/20 HTML / CSS
css3实现顶部社会化分享按钮示例
2014/05/06 HTML / CSS
HTML5之web workers_动力节点Java学院整理
2017/07/17 HTML / CSS
canvas绘制文本内容自动换行的实现代码
2019/01/14 HTML / CSS
广州地球村科技数据库题目
2016/04/25 面试题
C#如何调用Windows程序打开一个文档
2014/12/26 面试题
三个Unix的命令面试题
2015/04/12 面试题
商务考察邀请函范文
2014/01/21 职场文书
退伍老兵事迹材料
2014/01/31 职场文书
网络管理专业求职信
2014/03/15 职场文书
大学竞选班干部演讲稿
2014/08/21 职场文书
招商银行工作证明
2015/06/17 职场文书
2016年党校科级干部培训班学习心得体会
2016/01/06 职场文书
2016廉洁教育心得体会
2016/01/20 职场文书
因个人工作失误检讨书
2019/06/21 职场文书
浅谈mysql执行过程以及顺序
2021/05/12 MySQL