iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >一文详解Python中的super 函数
  • 397
分享到

一文详解Python中的super 函数

2024-04-02 19:04:59 397人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录实战场景实战编码单继承使用实战场景 经常有朋友问,学 python 面向对象时,翻阅别人代码,会发现一个 super() 函数,那这个函数的作用到底是什么? super() 函数

实战场景

经常有朋友问,学 python 面向对象时,翻阅别人代码,会发现一个 super() 函数,那这个函数的作用到底是什么?

super() 函数的用途如下,在子类中调用父类的方法,多用于类的继承关系。

其语法格式如下所示:

super(type[, object-or-type])

参数说明如下:

  • type:类,可选参数
  • object-or-type:对象或类,一般为 self,也是可选参数。

返回值是代理对象。

可以直接查询官方帮助手册:

help(super)

输出信息如下所示:

Help on class super in module builtins:
class super(object)
| super() -> same as super(__class__, <first argument>)
| super(type) -> unbound super object
| super(type, obj) -> bound super object; requires isinstance(obj, type)
| super(type, type2) -> bound super object; requires issubclass(type2, type)
| Typical use to call a cooperative superclass method:
| class C(B):
| def meth(self, arg):
| super().meth(arg)
| This works for class methods too:
| class C(B):
| @claSSMethod
| def cmeth(cls, arg):
| super().cmeth(arg)

对输出结果进行分析之后,可以得到如下结论:

  • super 类是一个继承自 object 的类,super() 函数就是对该类的实例化;
  • 调用 super() 实例化之后,返回一个 super 对象;
  • super() 参数有四种搭配,具体看上述输出;

实战编码

单继承使用

直接看一下单继承相关代码,其中使用类名去调用父类方法。

class A:
def funA(self):
print("执行 A ,输出橡皮擦")
class B(A):
def funB(self):
# self 表示 B 类的实例
A.funA(self)
print("执行 B ,输出铅笔")
b = B()
b.funB()

上述代码在 B 类中增加了 funB 函数,并且去调用 A 类中的 funA 函数,此时输出的内容如下所示:

执行 A ,输出橡皮擦
执行 B ,输出铅笔

如果将上述代码修改为 super() 函数调用父类方法,可以使用下述代码:

class A:
def funA(self):
print("执行 A ,输出橡皮擦")
class B(A):
def funB(self):
# 注意 super() 函数的用法
super().funA()
print("执行 B ,输出铅笔")
b = B()
b.funB()

上述代码与之前的运行结果一致,在单继承的层级结构中,super 可以直接引用父类,即在子类中不需要使用父类名调用父类方法,而使用 代理对象(super 对象) 去调用,这样的好处就是当父类名改变或继承关系发生改变时,我们不需要对调用进行反复修改。

接下来看一下多继承情况下,super() 函数的实战场景。

class A:
def run(self):
print('AAA')
class B:
def run(self):
print('BBB')
class C:
def run(self):
print('CCC')
class D(A, B, C):
def run(self):
super().run()
d = D()
d.run()

此时输出的结果是 AAA,可以看到 super 匹配到的数据是 A 类中的 run 函数,也就是最左侧类中的方法,下面修改一下各类中 run 函数的名称,使其存在差异。

class A:
def run1(self):
print('AAA')
class B:
def run2(self):
print('BBB')
class C:
def run3(self):
print('CCC')
class D(A, B, C):
def run(self):
# 调用 B 中 run2
super().run2()
d = D()
d.run()

当一个类继承多个类时,如果第一个父类中没有提供该方法,当前类实例就会通过 __mro__ 属性进行向上搜索,如果到 object 类都没有检索到该方法,就会引发 AttributeError 异常。

基于上述逻辑,我们可以扩展一下,使用 super() 函数中的参数。

class A:
def run(self):
print('AAA')
class B:
def run(self):
print('BBB')
class C:
def run(self):
print('CCC')
class D(A, B, C):
def run(self):
# 调用 C 中 run
super(B, self).run()
d = D()
d.run()

此时输出的结果是 CCC,该结果输出表示了使用 super 函数之后,可以使用 super(类,self) 指定以哪个类为起点检索父类中的方法,上述代码设置的 B,就表示从 B 开始检索,后续找到了 C 类,其中包含 run() 方法,所以输出 CCC。

__mro__ 属性的说明。

MRO 是 method resolution order,即方法解析顺序,其本质是继承父类方法时的顺序表。在 Python 中可以使用内置属性 __mro__ 查看方法的搜索顺序,例如下述代码,重点查看输出部分内容。

class A:
def run(self):
print('AAA')
class B:
def run(self):
print('BBB')
class C:
def run(self):
print('CCC')
class D(A, B, C):
def run(self):
# 调用 C 中 run
super(B, self).run()
print(D.__mro__)

输出的结果如下所示:

(<class '__main__.D'>, <class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class 'object'>)

你可以修改一下继承顺序,然后得到不同的输出结果:

(<class '__main__.D'>, <class '__main__.A'>, <class '__main__.C'>, <class '__main__.B'>, <class 'object'>)

在搜索方法的时候,是按照 __mro__ 的输出结果从左到右进行顺序查找的,逻辑如下:

  • A. 找到方法,停止检索;
  • B. 没有找到,继续检索下一类;
  • C. 如果到最后都没有找到,程序报错。

到此这篇关于一文了解Python中的super 函数的文章就介绍到这了,更多相关Python super 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 一文详解Python中的super 函数

本文链接: https://www.lsjlt.com/news/120314.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 一文详解Python中的super 函数
    目录实战场景实战编码单继承使用实战场景 经常有朋友问,学 Python 面向对象时,翻阅别人代码,会发现一个 super() 函数,那这个函数的作用到底是什么? super() 函数...
    99+
    2024-04-02
  • python的super函数详解
    python基础知识 用于类继承的super函数介绍 目录 python基础知识 一、super函数的用途 二、了解super函数的基本信息 三、多继承不重复调用  四、多继承重复调用 总结 一、super函数的用途 ...
    99+
    2023-09-26
    python
  • python super()函数的详解
    目录super的用法super的原理总结Python是一门面向对象的语言,定义类时经常要用到继承,在类的继承中,子类继承父类中已经封装好的方法,不需要再次编写,如果子类如果重新定义了...
    99+
    2024-04-02
  • python 中的 super详解
    目录super 的完整形式super 的使用提到 super,最直接的想法就是它代表了父类,替父类执行某些方法。但是理解也仅止步于此,下面对 super 做进一步理解 super 的...
    99+
    2024-04-02
  • 一文详解Python中的Map,Filter和Reduce函数
    目录1. 引言2. 高阶函数3. Lambda表达式4. Map函数5. Filter函数6. Reduce函数7. 总结1. 引言 本文重点介绍Python中的三个特殊函数Map,...
    99+
    2024-04-02
  • Python中的super函数怎么用
    这篇文章主要介绍了Python中的super函数怎么用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python中的super函数怎么用文章都会有所收获,下面我们一起来看看吧。...
    99+
    2024-04-02
  • python中super()函数的理解与基本使用
    目录前言super的用法 super的原理 Python super()使用注意事项混用super与显式类调用 不同种类的参数 总结 前言 Python是一门面向对象的语言,定义类时...
    99+
    2024-04-02
  • python中关于对super()函数疑问解惑
    目录案例一:运行下面的代码结果是什么?案例二:运行下面的代码结果是什么?案例三、更复杂些的继承,和上面的同理总结案例一:运行下面的代码结果是什么? class Person: ...
    99+
    2024-04-02
  • python中super().__init__()作用详解
    目录super().__ init__ ()有什么用?1、分别理解super()和 __ init __()1.1、super()1.2、__ init __()1.3、super(...
    99+
    2023-02-03
    python中super().__init__() python中super()
  • Python中的Super用法示例详解
    目录Python Super用法附:super的典型用法总结 Python Super用法 这篇文章我们来介绍一下 super,我相信大部分的人使用 super 都是使用这...
    99+
    2024-04-02
  • 一文详解C++11中的lambda函数
    目录1.lambda函数语法1.1 捕获列表1.2 mutable修饰符1.3 匿名lambda函数2.lambda与STL我可以明确告诉你:lambda函数是C++11中最重要的,...
    99+
    2023-02-07
    C++11 lambda函数使用 C++11 lambda函数 C++11 lambda
  • 图文详解Python中最神秘的一个魔法函数
    目录前言1、有点价值的missing()2、神出鬼没的missing()3、被施魔法的missing()4、小结5、总结前言 一个非常神秘的魔术方法。 这个方法非常不起眼,用途狭窄,...
    99+
    2024-04-02
  • 一文详解Golang的函数特性
    目录1. 函数的声明2. 函数的参数3. 函数的返回值4. 函数的变量作用域5. 函数的闭包6. 函数的方法7. 匿名函数和闭包8. 总结Golang(也被称为Go)是一种编译型编程...
    99+
    2023-05-18
    Golang函数特性 Golang函数 Go 函数
  • Python groupby函数图文详解
    一、分组原理 核心: 1、不论分组键是数组、列表、字典、Series、函数,只要其与待分组变量的轴长度一致都可以传入groupby进行分组。 2、默认axis=0按行分组,可指定ax...
    99+
    2024-04-02
  • python中函数的参数详解
    目录一、参数的定义1、函数的参数在哪里定义2、带参数的函数调用:二、参数分类1、根据实参进行分类1.1、位置参数(未命名参数)1.2、关键字参数(命名参数)2、根据形参进行分类2.1...
    99+
    2024-04-02
  • 详解Python中的 type()函数
    目录你好类型type()和数字序列类型自定义数据类型Python type() 函数摘要将通过各种例子来了解如何在 Python 中使用 type() 函数。 你好类型 打印 &qu...
    99+
    2024-04-02
  • Python函数介绍:super函数的功能和示例
    Python函数介绍:super函数的功能和示例super()函数是Python中常用的一个内置函数,主要用于调用父类(超类)的方法。使用super()函数可以实现在子类中调用父类中已被覆盖的方法。本文将详细介绍super函数的功能和示例,...
    99+
    2023-11-04
    class Parent:
  • Python中reduce函数详解
    目录1 reduce用法2 reduce与for循环性能对比reduce函数原本在python2中也是个内置函数,不过在python3中被移到functools模块中。 reduce...
    99+
    2024-04-02
  • python 中 os.walk() 函数详解
    os.walk()是一种遍历目录数的函数,它以一种深度优先的策略(depth-first)访问指定的目录。 其返回的是(root,dirs, files), root代表当前遍历的目...
    99+
    2024-04-02
  • 一文详解C语言中文件相关函数的使用
    目录一、文件和流1、程序文件2、数据文件3、流二、文件组成三、文件的打开和关闭1、文件的打开fopen2、文件关闭fclose四、文件的顺序读写1、使用fputc和fgetc写入/读...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作