Python编程super应用场景及示例解析
作者:曲鸟 发布时间:2023-06-10 03:00:46
一、什么是super
1.super
也是一个类,是的。他不是一个方法也不是一个内置的关键字。
class A:
pass
print(type(super(A)))
输出结果
<class 'super'>
直接通过查看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算法的讲解可以参考这篇文章https://www.jb51.net/article/224606.htm
三、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
来实现。
来源:https://blog.csdn.net/momoda118/article/details/120247022


猜你喜欢
- 因为使用python+selenium有时候需要获取当前文件的上一级目录,找了一段时间找到了,在此记录下来;os.path.dirname(
- 前言字符串是 字符的序列 。字符串基本上就是一组单词。我几乎可以保证你在每个Python程序中都要用到字符串,所以请特别留心下面这部分的内容
- 前言继老干妈、辣条之后,中国美颜软件在海外一夜成名,把所有人都幻化成了粉红小甜心。人类学者克里斯特尔·阿比丁博士认为,
- 相信大家都知道html和css,知道html结构和css表现分离,知道html语义化,这些都是这几年的热门关键字。语义化的html在国内也是
- 前言MySQL性能优化是一个老生常谈的问题,无论是在实际工作中还是面试中,都不可避免遇到相应的场景,下面博主就总结一些能够帮助大家解决这个问
- 阅读上一篇:FrontPage2002简明教程三:网页布局 网页的强大之处就在它的超链接,在浏览器中通过点击网页中的超链接,可以很方便地打开
- 本文将介绍如何使用公司运行服务器进行开发调试,以及使用远程服务器python解释器,整理了对应的配置流程。进入配置页面Pycharm菜单栏,
- 1.通过工具"DTS"的设计器进行导入或者导出DTS的设计器功能强大,支持多任务,也是可视化界面,容易操作,但知道的人一
- privot多对多关系的中间表。PT5框架会自动把privot带上。我们需要隐藏,因为我们不需要privot,而且pritvot也不在我们模
- 题目一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?程序分析因为168对于指数 * 来说实在太小了,
- Heroku是一个很棒的平台,它有很多的控件,并且搭建环境相对来说也比较容易。本指南中,我将一步一步指导你在Heroku平台上部署一个简单地
- 1. A List Apart CSS TopicsA List Apart是一个CSS优秀文章的收集网站,从1999年开始收集文章,关注最
- 前言接着上一篇的故事工厂模式继续,手机要出厂,显然光一个手机肯定是不行的,还需要包装盒、充电器等等东西。我们按照上一篇提到的工厂模式,去建立
- 代码如下:--程序员们在编写一个雇员报表,他们需要得到每个雇员当前及历史工资状态的信息, --以便生成报表。报表需要显示每个人的晋升日期和工
- 在用爬虫爬取网站数据时,有些站点的一些关键数据的获取需要使用账号登录,这里可以使用requests发送登录请求,并用Session对象来自动
- 根据网上的一些说法,在python里获取ms级系统时间可以通过以下方式获取:import datetimeprint(datetime.da
- 工厂模式(Factory Pattern)是什么工厂模式是一种创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会
- 解析来自各种来源和格式的时间序列信息pd.to_datetime( arg,#int, float, str, d
- 一、前言MYSQL中MDL锁一直是一个比较让人比较头疼的问题,我们谈起锁一般更加倾向于INNODB下层的gap lock、next key
- 简介:破解rar和zip压缩包。Windows下使用PyCharm软件。1.步骤1.环境指令pip install 安装。如果是rar文件需