Python中super函数的详细用法,直观理解

这篇具有很好参考价值的文章主要介绍了Python中super函数的详细用法,直观理解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

super相关的介绍文章看了无数遍,每次看得都云里雾里的,没过多久就忘了,只模糊知道跟MRO有关,但是稍微一复杂就不知道怎么回事了,本篇文章主要记录我对super的理解

1.粗暴简单的理解

super的作用就是执父类的方法,虽然这句话不完全对,但是也差不多是那么个意思了。

比如以单继承为例

class A:
    def p(self):
        print('A')
class B(A):
    def p(self):
        super().p()
B().p()

>>> A

可以看到B().p()其实就是执行的A.p

2.万能模板解题技巧

前面介绍的是最简单的情况,那万一复杂一点,比如多继承的情况呢?这种情况我们只要知道 MRO 序列,无论super怎么变化都不怕了,记住公式就完事了。MRO 序列简单理解就是记录了各个类继承的先后顺序,看下面的例子就明白了

MRO 的介绍可以看这篇文章: https://python3-

cookbook.readthedocs.io/zh_CN/latest/c08/p07_calling_method_on_parent_class.html

我们看下面的例子

class A:
    def p(self):
        print('A')
class B():
    def p(self):
        print('B')
class C(A,B):
    def p(self):
        print('C')
class D(C):
    def p(self):
        print('D')
a = A()
b = B()
c = C()
d = D()

四个类的MRO (可以通过查看__mro__属性获得,例如A.__mro__)) 分别是:

A: (A, object)
B: (B, object)
C: (C, A, B, object)
D: (D, C, A, B, object)

什么意思呢,我们以A类为例,它的MRO顺序是他自己和object,很好理解,因为python里一切都是对象,所以你可以看到四个类的终点都是object。那C类的 MRO 也好理解,第一个顺序永远是寄几,然后按照代码顺序依次是 A,B,最后是object。

相信看到这你应该知道MRO是什么意思了吧,那super是怎么用的呢?

super本身其实就是一个类,super()其实就是这个类的实例化对象,它需要接收两个参数 super(class, obj),它返回的是obj的MRO中class类的父类(可能有点绕,待会看后面的栗子就好懂了):

  • class:就是类,这里你可以是A,B,C或者D
  • obj:就是一个具体的实例对象,即a,b,c,d。我们经常在类的__init__函数里看到super的身影,而且一般都是写成这个样子的super(className, self).__init__(),self其实就是某个实例化的对象。

3.举几个栗子

看到这里如果还是没明白,咱们就多看几个例子就完事了,建议你可以打开ipython输入如下示例,可以更加直观感受super:
栗子1

首先我们看看下面的命令是什么意思呢?

super(C, d).p()

前面我们说过super的作用是 返回的是obj的MRO中class类的父类,在这里就表示返回的是d的MRO中C类的父类:

  • 返回的是d的MRO:(D, C, A, B, object)
  • 中C类的父类:A

那么super(C, d)就等价于A,那么super(C, d).p()会输出A
栗子2

下面代码结果是什么呢?

super(A, c).p()

返回的是c的MRO中A类的父类:

  • 返回的是c的MRO:(C, A, B, object)
  • 中C类的父类:B

所以最后的输出是B

栗子.

注意:有的类里面没有super()

class A:
    def p(self):
        print('A')
class B(A):
    def p(self):
		super().p()
        print('B')
class C(B):
    def p(self):
        print('C')
class D(C):
    def p(self):
        print('D')

d = D()
d.p()

这个很简单,最后只会输出D

那如果D类改成如下样子呢?

class D(C):
    def p(self):
		super().p()
        print('D')

很简单,我们首先写出D的MRO为 (D,C,B,A,object),缺省状态下,super()就表示前一个父类,这里就是C类,那么super().p()就会调用C的p函数,但是C.p里没有调用super,所以就与A,B类无关了,那么最终的输出就是C,D

我们再看看最复杂的继承情况

class A:
    def p(self):
        print('A')
#Python小白学习交流群:153708845        
class B(A):
    def p(self):
        super().p()
        print('B')
class C(B):
    def p(self):
        super().p()
        print('C')
class D(C):
    def p(self):
        super().p()
        print('D')
d = D()
d.p()

这里建议你自己在纸上画一下

MRO

所以最终结果是 A B C D

4.总结

对于无论有多少个super(class, obj),我们首先需要知道obj的MRO是什么,然后找到class的前一个class是什么就好了。文章来源地址https://www.toymoban.com/news/detail-733788.html

到了这里,关于Python中super函数的详细用法,直观理解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python中zeros函数和ones函数的详细用法

    在使用Python进行数据分析和科学计算时,经常需要创建和操作多维数组。NumPy是Python中一个常见的数学库,它提供了许多方便的函数来创建、操作和处理多维数组。 NumPy中常用的两个函数是zeros()函数和ones()函数。这些函数可以帮助我们快速创建特定维度和形状的多维数组,并

    2024年02月12日
    浏览(41)
  • python的super函数详解

    用于类继承的super函数介绍 目录 python基础知识 一、super函数的用途 二、了解super函数的基本信息 三、多继承不重复调用  四、多继承重复调用 总结 一、super函数的用途 (1)避免在改动父类名称时还需改动子类调用方法的代码 (2)在子类中按照一套内置的顺序自动调用父类

    2024年02月12日
    浏览(25)
  • 机器学习之梯度下降法直观理解

            形象化举例,由上图所示,假如最开始,我们在一座大山上的某处位置,因为到处都是陌生的不知道下山的路,所以只能摸索着根据直觉,走一步算一步。在此过程中,每走到一个位置的时候,都会求解当前位置的梯度,沿着梯度的负方向,也就是当前最陡峭的位

    2024年02月21日
    浏览(31)
  • 【halcon】灰度直方图直观理解与应用

    横坐标:是 0~255 表示灰度值的范围 纵坐标:是在不同灰度值下像素的个数! 那么灰度直方图的本质就是统计不同灰度下像素的个数! 它的直观目的,就是查看灰度的分布情况! 全局的阈值分割 threshold  threshold (ImageChannel3, Regions, 248, 255) 选择一个灰度范围,分割出在次范围

    2024年02月10日
    浏览(38)
  • 【AI绘画】用张图直观理解Stable Diffusion

    手把手教你入门绘图超强的AI绘画,用户只需要输入一段图片的文字描述,即可生成精美的绘画。给大家带来了全新保姆级教程资料包 (文末可获取) 作者****|Jay Alammar 翻译|杨婷、徐佳渝 最近,AI图像生成引人注目,它能够根据文字描述生成精美图像,这极大地改变了人

    2024年02月20日
    浏览(33)
  • C++的rand()函数详细用法

    rand() 函数是C++标准库中的一个伪随机数生成器,它返回一个在0到 RAND_MAX 之间的整数,其中 RAND_MAX 是一个常量,通常定义为32767。由于 rand() 函数生成的随机数序列是固定的,因此在使用 rand() 函数之前,通常需要调用 srand() 函数初始化随机数种子。 srand() 函数接受一个无符号

    2024年02月15日
    浏览(44)
  • MarkDown学习笔记 直观全面详细

    为什么我们要学习 Markdown 呢?因为 Markdown 简单易学易上手,可以以纯文本格式编写文档,然后转换成有效的HTML文档,并且以导出 HTML 、Word、图像、PDF、Epub 等多种格式的文档,许多网站平台的文章、博客、论文均可用Markdown编写文章。 使用#号标记,可以表示1-6级标题, 随

    2024年01月22日
    浏览(35)
  • C++ Sleep函数详细介绍与用法

    这个函数就是让程序挂起一段时间,或者说是让程序暂停一段时间。 这个函数需要头文件: 如果是Linux的话则需要 如果是Windows的话则需要 用法: 就是在Sleep()中写上要暂停的毫秒数。 注意: Sleep()中的第一个字母S是大写。 并且1000毫秒=1秒 样例: 它们都用来进行线程控制

    2024年02月14日
    浏览(37)
  • 全面理解java中的构造方法以及this关键字的用法(超详细)

    Hello,各位铁汁们!我是小🐟儿哈!今天我又来更新我的Java基础学习博客了。 本篇主要内容概述: 1、🍚如何用构造方法初始化对象 2、🍚为啥要有this这个 3、🍚this.属性名访问成员变量、成员方法 4、🍚this.方法名 || this.()的用法 目录 初识构造方法  构造方法的使

    2023年04月09日
    浏览(49)
  • Python [::-1]的简单理解与用法

    从结果上来看,[::-1]的作用是 对列表进行翻转 ,比方说: 输出: 可以发现这个东西的用法和reversed函数是相同的,只不过更为简洁: 输出: 那么这个东西的原理是什么呢?一般来说,我们见过一个冒号的情况比较多,用来做列表切片: 输出: 多一个冒号的话,新冒号后面

    2024年02月12日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包