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修改Excel数据的实例代码
Nov 01 Python
python使用socket连接远程服务器的方法
Apr 29 Python
解决python 输出是省略号的问题
Apr 19 Python
浅谈python实现Google翻译PDF,解决换行的问题
Nov 28 Python
在python中利用最小二乘拟合二次抛物线函数的方法
Dec 29 Python
Python数据可视化教程之Matplotlib实现各种图表实例
Jan 13 Python
ZABBIX3.2使用python脚本实现监控报表的方法
Jul 02 Python
Pandas中resample方法详解
Jul 02 Python
Django框架表单操作实例分析
Nov 04 Python
Python笔记之观察者模式
Nov 20 Python
如何通过命令行进入python
Jul 06 Python
基于python实现操作git过程代码解析
Jul 27 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&amp;MYSQL留言板源码
2020/07/19 PHP
PHP图片处理之图片背景、画布操作
2014/11/19 PHP
PHP模板解析类实例
2015/07/09 PHP
WordPress用户登录框密码的隐藏与部分显示技巧
2015/12/31 PHP
php探针使用原理和技巧讲解
2019/09/17 PHP
js文字滚动停顿效果代码
2008/06/28 Javascript
3Z版基于jquery的图片复选框(asp.net+jquery)
2010/04/12 Javascript
再谈javascript图片预加载技术(详细演示)
2011/03/12 Javascript
jQuery Tab插件 用于在Tab中显示iframe,附源码和详细说明
2011/06/27 Javascript
你必须知道的Javascript知识点之&quot;深入理解作用域链&quot;的介绍
2013/04/23 Javascript
jQuery中after的两种用法实例
2013/07/03 Javascript
深入理解jQuery中live与bind方法的区别
2013/12/18 Javascript
JavaScript中常见获取元素的方法汇总
2015/03/04 Javascript
JS实现带关闭功能的阿里妈妈网站顶部滑出banner工具条代码
2015/09/17 Javascript
Javascript的表单验证-初识正则表达式
2016/03/18 Javascript
详解JavaScript实现设计模式中的适配器模式的方法
2016/05/18 Javascript
jQuery实现图片向左向右切换效果的简单实例
2016/05/18 Javascript
jquery实现下拉菜单的手风琴效果
2017/07/23 jQuery
浅谈vuex 闲置状态重置方案
2018/01/04 Javascript
Node.js实现mysql连接池使用事务自动回收连接的方法示例
2018/02/03 Javascript
Vue导出页面为PDF格式的实现思路
2018/07/31 Javascript
详解如何在微信小程序开发中正确的使用vant ui组件
2018/09/13 Javascript
利用vue-i18n实现多语言切换效果的方法
2019/06/19 Javascript
详解mpvue开发微信小程序基础知识
2019/09/23 Javascript
[01:51]2014DOTA2西雅图邀请赛 MVP 外卡赛black场间采访
2014/07/09 DOTA
Python isinstance判断对象类型
2008/09/06 Python
python使用百度翻译进行中翻英示例
2014/04/14 Python
对python 命令的-u参数详解
2018/12/03 Python
Unineed旗下时尚轻奢网站:FABHunt
2019/05/13 全球购物
Python面试题集
2012/03/08 面试题
QA工程师岗位职责
2013/11/20 职场文书
百年校庆节目主持词
2014/03/27 职场文书
幼师求职自荐信
2014/05/31 职场文书
教代会闭幕词
2015/01/28 职场文书
Django使用redis配置缓存的方法
2021/06/01 Redis
微信小程序scroll-view不能左右滑动问题的解决方法
2021/07/09 Javascript