Python 3 中的 super()

Python super

Python 的 super() 函数允许我们显式地引用父类。在继承的情况下,当我们想要调用父类函数时,它非常有用。

Python super 函数示例

首先,让我们看一下我们在 Python 继承教程中使用的以下代码。在该示例代码中,父类是 Person,子类是 Student。代码如下所示。

class Person:# 初始化变量name = ""age = 0# 定义构造函数def __init__(self, person_name, person_age):self.name = person_nameself.age = person_age# 定义类方法def show_name(self):print(self.name)def show_age(self):print(self.age)# 子类定义开始
class Student(Person):studentId = ""def __init__(self, student_name, student_age, student_id):Person.__init__(self, student_name, student_age)self.studentId = student_iddef get_id(self):return self.studentId  # 返回学生 ID 的值# 子类定义结束# 创建父类对象
person1 = Person("Richard", 23)
# 调用对象的成员方法
person1.show_age()
# 创建子类对象
student1 = Student("Max", 22, "102")
print(student1.get_id())
student1.show_name()

在上面的示例中,我们调用了父类函数如下:

Person.__init__(self, student_name, student_age) 

我们可以用以下方式替换为 python super 函数调用。

super().__init__(student_name, student_age)

输出在两种情况下都将保持不变,如下图所示。

Python 3 super

请注意,上述语法适用于 Python 3 的 super 函数。如果你使用的是 Python 2.x 版本,则略有不同,你需要做以下更改:

class Person(object):
...super(Student, self).__init__(student_name, student_age)

第一个更改是将 object 作为 Person 的基类。在 Python 2.x 版本中使用 super 函数是必需的。否则,你将会收到以下错误。

Traceback (most recent call last):File "super_example.py", line 40, in <module>student1 = Student("Max", 22, "102")File "super_example.py", line 25, in __init__super(Student, self).__init__(student_name, student_age)
TypeError: must be type, not classobj

super 函数本身的语法也有所改变。正如你所看到的,Python 3 的 super 函数使用起来更加简单,语法也更加清晰。

Python super 函数与多层继承

正如我们之前所述,Python 的 super() 函数允许我们隐式地引用父类。但在多层继承的情况下,它将引用哪个类呢?好吧,Python 的 super() 总是引用直接的父类。此外,Python 的 super() 函数不仅可以引用 __init__() 函数,还可以调用父类的所有其他函数。因此,在下面的示例中,我们将看到这一点。

class A:def __init__(self):print('Initializing: class A')def sub_method(self, b):print('Printing from class A:', b)class B(A):def __init__(self):print('Initializing: class B')super().__init__()def sub_method(self, b):print('Printing from class B:', b)super().sub_method(b + 1)class C(B):def __init__(self):print('Initializing: class C')super().__init__()def sub_method(self, b):print('Printing from class C:', b)super().sub_method(b + 1)if __name__ == '__main__':c = C()c.sub_method(1)

让我们看看上述 Python 3 多层继承的示例输出。

Initializing: class C
Initializing: class B
Initializing: class A
Printing from class C: 1
Printing from class B: 2
Printing from class A: 3

因此,从输出中我们可以清楚地看到,首先调用了类 C 的 __init__() 函数,然后是类 B,最后是类 A。通过调用 sub_method() 函数也发生了类似的事情。

为什么我们需要 Python 的 super 函数

如果你之前有 Java 语言的经验,那么你应该知道在那里也称为 super 对象的基类。因此,这个概念对于程序员来说实际上是有用的。然而,Python 也保留了使用超类名称来引用它们的功能。而且,如果你的程序包含多层继承,那么这个 super() 函数对你很有帮助。所以,这就是关于 Python super 函数的全部内容。希望你理解了这个主题。如果有任何疑问,请在评论框中提问。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/677677.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【论文阅读笔记】InstantID : Zero-shot Identity-Preserving Generation in Seconds

InstantID:秒级零样本身份保持生成 理解摘要Introduction贡献 Related WorkText-to-image Diffusion ModelsSubject-driven Image GenerationID Preserving Image Generation Method实验定性实验消融实验与先前方法的对比富有创意的更多任务新视角合成身份插值多身份区域控制合…

Linux操作系统基础(六):Linux常见命令(一)

文章目录 Linux常见命令 一、命令结构 二、ls命令 三、cd命令 四、mkdir命令 五、touch命令 六、rm命令 七、cp命令 八、mv命令 九、cat命令 十、more命令 Linux常见命令 一、命令结构 command [-options] [parameter]说明: command : 命令名, 相应功能的英文单词…

Dubbo源码一:【Dubbo与Spring整合】

正常在项目中&#xff0c;我们都是在Spring环境下使用Dubbo&#xff0c;所以我们这里就在Spring的环境下看看Dubbo是如何运作的 入口 在源码下载下来之后&#xff0c;有一个dubbo-demo目录&#xff0c;里面有一个基于spring注解的子目录dubbo-demo-annotation, 里面有一个生产…

Linux - updatedb 命令

1. 功能 updatedb 命令用来创建或更新slocate命令所必需的数据库文件。updatedb 命令的执行过程较长&#xff0c;因为在执行时它会遍历整个系统的目录树&#xff0c;并将所有的文件信息写入 slocate 数据库文件中。 补充说明&#xff1a;slocate 本身具有一个数据库&#xff…

【PyQt】10 QLineEdit

文章目录 前言一、回显模式&#xff08;EchoMode&#xff09;1.1 四种回显模式1.2 代码展示运行结果 二、校验器2.1 代码2.2 运行结果 三、通过掩码限制输入3.1 代码3.2 运行结果 总结 前言 1、QLineEdit 可以输入单行文字 2、回显模式 3、校验器 4、掩码输入 一、回显模式&am…

Linux开发:PAM3 Ubuntu(22.04)安装PAM开发库

Ubuntu22.04默认是不带pam开发库的&#xff0c;需要通过以下命令进行安装 sudo apt install libpam0g-dev 关于PAM的文档可以参考&#xff1a; Ubuntu Manpage: pam - Pluggable Authentication Modules Library 也可以通过man进行查看&#xff1a; man 3 pam 编译程序是需要加…

16进制内存地址——计算机内存地址为什么用16进制?

在计算机底层&#xff0c;内存地址通常以十六进制表示。使用十六进制可以更好地理解和识别内存地址、指针和寄存器等底层系统信息。 谈到内存地址&#xff0c;不可避免引出指针的概念。 变量和数据在内存中是如何存放的呢&#xff1f;我们知道&#xff0c;所谓程序是由计算机&a…

k8s-资源限制与监控 15

资源限制 上传实验所需镜像 Kubernetes采用request和limit两种限制类型来对资源进行分配。 request(资源需求)&#xff1a;即运行Pod的节点必须满足运行Pod的最基本需求才能 运行Pod。 limit(资源限额)&#xff1a;即运行Pod期间&#xff0c;可能内存使用量会增加&#xff0…

Jupyter Notebook如何在E盘打开

Jupyter Notebook如何在E盘打开 方法1&#xff1a;方法2&#xff1a; 首先打开Anaconda Powershell Prompt, 可以看到默认是C盘。 可以对应着自己的界面输入&#xff1a; 方法1&#xff1a; (base) PS C:\Users\bella> E: (base) PS E:\> jupyter notebook方法2&#x…

[AIGC] Tomcat:一个简单 and 高效的 Java Web 服务器

Tomcat&#xff08;Tomcat Server&#xff09;是 Apache 基金会下的一个开源项目&#xff0c;它是一个简单 and 高效的 Java Web 服务器&#xff0c;支持 Servlet 2.5、JSP 2.2 和 EL 2.2 规范。Tomcat 是当今最受欢迎的 Java Web 服务器之一&#xff0c;它在 Java 世界中被广泛…

跳表详解和实现|深挖Redis底层数据结构

文章目录 跳表前言项目代码仓库认识跳表跳表的实现思路跳表性能分析对比平衡树&#xff08;avl和红黑树&#xff09;和哈希表使用手册成员变量成员函数构造析构迭代器sizeclearemptyoperatorfindinserterase 跳表细节实现节点定义跳表结构定义构造、析构、拷贝构造和赋值重载si…

人工智能算法:理解其工作原理及其在现实世界中的应用

随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;已逐渐成为我们生活中不可或缺的一部分。从智能语音助手到自动驾驶汽车&#xff0c;再到医疗诊断系统&#xff0c;人工智能算法正以前所未有的速度改变着我们的世界。本文将带您深入探讨人工智能算法的工作原…

【MySQL】数据库的基础——数据库的介绍、MySQL的介绍和架构、SQL分类、MySQL的基本使用、MySQL的存储引擎

文章目录 MySQL1. 数据库的介绍1.2 主流数据库 2. MySQL的介绍2.1 MySQL架构2.2 SQL分类2.3 MySQL的基本使用2.4 MySQL存储引擎 MySQL 1. 数据库的介绍 数据库&#xff08;Database&#xff0c;简称DB&#xff09;是按照数据结构来组织、存储和管理数据的仓库。它是长期存储在计…

uni-app x,一个纯原生的Android App开发工具

uni-app x&#xff0c;下一代uni-app&#xff0c;一个神奇的产品。 用vue语法、uni的组件、api&#xff0c;以及uts语言&#xff0c;编译出了kotlin的app。不再使用js引擎和webview。纯纯的kotlin原生app。 uni-app x&#xff0c;让“跨平台开发性能不如原生”的这条曾广为流…

面试 JavaScript 框架八股文十问十答第四期

面试 JavaScript 框架八股文十问十答第四期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01;关注专栏后就能收到持续更新&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1&#xff09;new操作符的实现…

LLM之LangChain(七)| 使用LangChain,LangSmith实现Prompt工程ToT

如下图所示&#xff0c;LLM仍然是自治代理的backbone&#xff0c;可以通过给LLM增加以下模块来增强LLM功能: Prompter AgentChecker ModuleMemory moduleToT controller 当解决具体问题时&#xff0c;这些模块与LLM进行多轮对话。这是基于LLM的自治代理的典型情况&#xff0c;…

Linux 命令基础

Shell概述 Linux操作系统的Shell作为操作系统的外壳&#xff0c;为用户提供使用操作系统的接口。它是命令语言、命令解释程序及程序设计语言的统称。 Shell是用户和Linux内核之间的接口程序&#xff0c;如果把硬件想象成一个球体的中心&#xff0c;内核围绕在硬件的外层管理着…

无锁序列系列笔记

下面是常见的一些实现方式&#xff1a; 1、借助智能指针来实现。下面是一篇参考博文 2、借助automic使用CAS(Compare And Swap)原子操作, std::atomic_flag&#xff0c;不同于所有 std::atomic 的特化&#xff0c;它保证是免锁的&#xff0c;不提供load()与store(val)操作&…

itextpdf使用:使用PdfReader添加图片水印

gitee参考代码地址&#xff1a;https://gitee.com/wangtianwen1996/cento-practice/tree/master/src/test/java/com/xiaobai/itextpdf 参考文章&#xff1a;https://www.cnblogs.com/wuxu/p/17371780.html 1、生成带有文字的图片 使用java.awt包的相关类生成带文字的图片&…

keil调试出现cannot evaluate新思路

我在用最新的keil时也出现了这个问题&#xff0c;网上说的办法几乎没啥用&#xff0c;包括魔术棒的设置和将变量定义为全局变量&#xff0c;都没用。 这里我使用的是keil5.13&#xff0c;编译器是AC6.21&#xff0c;硬件是STM32F407VET6 可以看到&#xff0c;即使是定义为全局变…