理解 Python 中的 `super()` 与 `__init__()` 方法

在 Python 的面向对象编程中,super() 函数和 __init__() 方法是两个非常重要的概念。它们在类的继承和初始化过程中扮演着关键的角色。本文将深入探讨这两个概念的工作原理,并通过示例代码来展示它们的使用。

基本原理

__init__() 方法

__init__() 是一个特殊的方法,也称为类的构造器。当你创建一个类的新实例时,Python 会自动调用这个方法。它通常用于初始化对象的状态,即设置对象的属性。

class Person:def __init__(self, name):self.name = name# 创建对象时,会自动调用 __init__() 方法
person = Person("Alice")
super() 函数

super() 是一个内置函数,它返回了当前类在继承链中的上一个类(即父类或基类)。当你在派生类中重写方法时,你可能想要调用父类中的相同方法,这时就可以使用 super() 来实现。

class Animal:def make_sound(self):print("Animal makes a sound")class Dog(Animal):def make_sound(self):super().make_sound()  # 调用 Animal 类的 make_sound 方法print("Dog barks")dog = Dog()
dog.make_sound()  # 输出: Animal makes a sound# 接着输出: Dog barks

示例代码

示例 1: 使用 super() 调用父类方法
class Vehicle:def start(self):print("Vehicle has started")class Car(Vehicle):def start(self):print("Car engine is on")super().start()  # 调用 Vehicle 类的 start 方法car = Car()
car.start()
# 输出:
# Car engine is on
# Vehicle has started

在这个例子中,Car 类继承了 Vehicle 类。在 Car 类的 start() 方法中,我们首先打印一条消息,然后使用 super().start() 来调用父类 Vehiclestart() 方法。

示例 2: 多级继承中的 super()
class Animal:def make_sound(self):print("Animal makes a sound")class Dog(Animal):def make_sound(self):super().make_sound()  # 调用 Animal 类的 make_sound 方法print("Dog barks")class SuperDog(Dog):def make_sound(self):super().make_sound()  # 调用 Dog 类的 make_sound 方法print("SuperDog howls")super_dog = SuperDog()
super_dog.make_sound()
# 输出:
# Animal makes a sound
# Dog barks
# SuperDog howls

在这个例子中,我们有一个多级继承的链条:SuperDog 继承自 Dog,而 Dog 继承自 Animal。在 SuperDogmake_sound() 方法中,super().make_sound() 首先调用 Dogmake_sound(),然后逐级向上调用。

示例 3: 使用 super() 初始化父类
class Person:def __init__(self, name):print("Person is initialized with name:", name)class Employee(Person):def __init__(self, name, job_title):super().__init__(name)  # 初始化 Person 类self.job_title = job_titleprint("Employee with job title:", job_title)employee = Employee("Alice", "Engineer")
# 输出:
# Person is initialized with name: Alice
# Employee with job title: Engineer

在这个例子中,Employee 类继承自 Person 类。在 Employee__init__() 方法中,我们使用 super().__init__(name) 来初始化父类 Person 的实例。

注意事项

  1. 正确使用 super(): super() 应该在你想要调用父类中的方法时使用。滥用 super() 可能会导致不必要的间接调用,降低代码的可读性。

  2. 理解 super() 的返回值: super() 返回的是父类的一个对象,你可以在其上调用任何父类的方法。

  3. 初始化顺序: 当你在一个派生类的 __init__() 方法中使用 super() 时,它首先会初始化所有父类,然后才是派生类自己的初始化代码。

  4. 避免无限递归: 如果在派生类的 __init__() 方法中忘记调用 super() 或者在父类的 __init__() 方法中也忘记调用其 super(),可能会导致无限递归。

  5. MRO(方法解析顺序): Python 使用一种称为方法解析顺序的机制来决定如何搜索方法。了解 MRO 对于理解 super() 如何工作非常重要。

通过上述的示例和解释,我们可以看到 super()__init__() 在 Python 类继承和对象初始化中扮演着至关重要的角色。正确使用这两个概念可以让我们写出更加清晰、易于维护的代码。希望这篇文章能够帮助初学者更好地理解这两个概念,并在实际编程中加以应用。

【痕迹】QQ+微信朋友圈和聊天记录分析工具1.0.4 (1)纯Python语言实现,使用Flask后端,本地分析,不上传个人数据。

(2)内含QQ、微信聊天记录保存到本地的方法,真正实现自己数据自己管理。

(3)数据可视化分析QQ、微信聊天记录,提取某一天的聊天记录与大模型对话。

下载地址:https://www.lanzoub.com/b00rn0g47e 密码:9hww

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

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

相关文章

K8S认证 | CKA题库 + 答案 | 查看Pod CPU资源使用量

2、查看集群中运行Pod CPU资源使用量 您必须在以下Cluster/Node上完成此考题: Cluster Master node Worker node k8s …

Vitis HLS 学习笔记--资源绑定-使用URAM(1)

目录 1. 简介 2. 代码分析 2.1 存储器代码 2.2 Implementation报告 2.3 存储器类型指定 2.4 存储器初始化 3. 总结 1. 简介 在博文《Vitis HLS 学习笔记--资源绑定-使用URAM-CSDN博客》中,介绍了如何在Vitis HLS环境下设计一个简易的存储器模型。 通过以下…

贝努利贝叶斯算法

基本用法 完整代码: from sklearn.naive_bayes import BernoulliNB from sklearn.datasets import make_blobs from sklearn.model_selection import train_test_split# 生成数据 X, y make_blobs(n_samples500, centers5, random_state8) X_train, X_test, y_tr…

企业或者个体户为什么会经营异常?

在复杂多变的市场经济环境中,无论是企业还是个体工商户,都可能遭遇经营异常的情况。及时识别这些预警信号并采取有效措施,对于避免潜在风险、保持健康发展至关重要。本文将深入探讨企业与个体户常见的经营异常类型、识别方法以及应对策略&…

MongoDB的安装和配置

简介 MongoDB 是一个开源的、面向文档的、非关系型数据库管理系统(NoSQL)。它使用JSON-like(BSON)文档来存储数据,使得数据结构更加灵活,易于理解和操作,特别适合处理大量的、半结构化或非结构…

智慧校园是教育信息化的首要目标

教育一词不止说的是学龄阶段的人,所有人的一生都离不开教育二字,从出世时分辩国际的颜色到学年到学校上学,再到走上社会作业后的各种训练,这些都离不开教育,仅仅不同阶段学习的办法有所不同。 其间,学龄时期…

Python代码:十、字符串连接

1、题目 小明有两个最好的朋友,他们的名字分别用input读入记录在两个字符串中,请使用字符串连接()帮助牛牛将两个朋友的名字依次连接在一个字符串中输出。 2、代码 import sysstr1 input() str2 input() str3 str1 str2 pr…

2024做安全测试必须要知道的几种方法!

前言 安全性测试(Security Testing)是指有关验证应用程序的安全等级和识别潜在安全性缺陷的过程,其主要目的是查找软件自身程序设计中存在的安全隐患,并检查应用程序对非法侵入的防范能力,安全指标不同,测试策略也不同。 但安全…

打包conda环境的两种方法:conda env export和Conda-Pack

打包conda环境的两种方法:conda env export和Conda-Pack 搭建项目环境可能是整个开发过程中最让人头疼的部分了。如何把我们辛辛苦苦搭建的环境打包起来,万一环境崩了还能迅速恢复,或者让别人能轻松地复制同样的设置呢? 今天&am…

微软中国 AI 团队搬至美国?可解决家属签证

多位网友爆料称,微软中国数百名员工收到公司邮件,询问是否愿意迁移至美国、澳大利亚、爱尔兰等国家工作。公司将负责亲属签证问题,以Azure云平台的AI团队为主,员工需要在6月7日前给出答复。 有微软员工表示情况属实,这…

超声波清洗机哪家好一点?四款超一流超声波清洗机大盘点

在追求极致清洁和维护精密工具、设备及珍贵物品的时代,超声波清洗机显得尤为重要。不仅因其高效、快速的清洁效果,更因其能够触及传统手工清洁所不能及的微小缝隙。无论你是珠宝设计师、机械工程师、还是热爱生活的普通家庭用户,超声波清洗机…

GO语言核心30讲 实战与应用 (io包,bufio包,os包,网络服务,http,性能分析)

原站地址:Go语言核心36讲_Golang_Go语言-极客时间 一、io包中的接口和工具 1. strings.Builder、strings.Reader 和 bytes.Buffer 这些类型实现了 io 包的很多接口,目的是什么? 是为了提高不同程序实体之间的互操作性。 程序实体是指比如网…