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中多线程thread与threading的实现方法
Aug 18 Python
用python实现简单EXCEL数据统计的实例
Jan 24 Python
Python中的浮点数原理与运算分析
Oct 12 Python
Pycharm 设置自定义背景颜色的图文教程
May 23 Python
python字典值排序并取出前n个key值的方法
Oct 17 Python
pycharm运行程序时在Python console窗口中运行的方法
Dec 03 Python
Pytorch实现的手写数字mnist识别功能完整示例
Dec 13 Python
pytorch逐元素比较tensor大小实例
Jan 03 Python
关于win10在tensorflow的安装及在pycharm中运行步骤详解
Mar 16 Python
Python3监控windows,linux系统的CPU、硬盘、内存使用率和各个端口的开启情况详细代码实例
Mar 18 Python
python利用google翻译方法实例(翻译字幕文件)
Sep 21 Python
Python关于拓扑排序知识点讲解
Jan 04 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
DC动漫人物排行
2020/03/03 欧美动漫
Yii获取当前url和域名的方法
2015/06/08 PHP
用php定义一个数组最简单的方法
2019/10/04 PHP
PHP配合fiddler抓包抓取微信指数小程序数据的实现方法分析
2020/01/02 PHP
jquery validate使用攻略 第四步
2010/07/01 Javascript
再次分享18个非常棒的jQuery表格插件
2011/04/10 Javascript
JavaScript基础知识之数据类型
2012/08/06 Javascript
jQuery中setTimeout的几种使用方法小结
2013/04/07 Javascript
jquery实现弹出层效果实例
2015/05/19 Javascript
详解JavaScript for循环中发送AJAX请求问题
2020/06/23 Javascript
最常见的左侧分类菜单栏jQuery实现代码
2016/11/28 Javascript
JavaScript定义全局对象的方法示例
2017/01/12 Javascript
AngularJS前端页面操作之用户修改密码功能示例
2017/03/27 Javascript
JavaScript中Hoisting详解 (变量提升与函数声明提升)
2017/08/18 Javascript
微信小程序中上传图片并进行压缩的实现代码
2018/08/28 Javascript
微信小程序签到功能
2018/10/31 Javascript
JS双向链表实现与使用方法示例(增加一个previous属性实现)
2019/01/31 Javascript
微信小程序吸底区域适配iPhoneX的实现
2020/04/09 Javascript
javascript实现贪吃蛇游戏(娱乐版)
2020/08/17 Javascript
[54:41]2018DOTA2亚洲邀请赛3月30日 小组赛B组 VGJ.T VS paiN
2018/03/31 DOTA
Python聚类算法之基本K均值实例详解
2015/11/20 Python
Python谱减法语音降噪实例
2019/12/18 Python
Flask 上传自定义头像的实例详解
2020/01/09 Python
django queryset 去重 .distinct()说明
2020/05/19 Python
浅析Python 序列化与反序列化
2020/08/05 Python
python爬取网易云音乐热歌榜实例代码
2020/08/07 Python
澳大利亚冒险体验:Adrenaline(跳伞、V8赛车、热气球等)
2017/09/18 全球购物
法国最大电子商务平台:Cdiscount
2018/03/13 全球购物
Gloeilampgoedkoop荷兰:在线购买灯泡
2019/02/16 全球购物
Brasty波兰:香水、化妆品、手表网上商店
2019/04/15 全球购物
Joseph官网:英国小众奢侈品牌
2019/05/17 全球购物
创业计划书——互联网商机
2014/01/12 职场文书
解除施工合同协议书
2014/10/17 职场文书
求职自我推荐信
2015/03/24 职场文书
大学生求职意向书
2015/05/11 职场文书
python 制作一个gui界面的翻译工具
2021/05/14 Python