理解 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.mzph.cn/diannao/13450.shtml

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

相关文章

Vue中的全局事件总线:EventBus与$bus的比较详解与实战应用

EventBus实例: var EventBus new Vue() 会创建一个名为EventBus的Vue实例,并将其存储在变量EventBus中。Vue.prototype.$bus new Vue() 则直接在Vue的原型上创建一个新的Vue实例,并将其赋值给$bus属性。 使用方式: var EventBus…

C# 结合 JavaScript 对 Web 控件进行数据输入验证

目录 关于数据验证 范例运行环境 验证设计 JavaScript 方法 设计 实现 调用示例 C# 方法 设计 实现 调用示例 小结 关于数据验证 在 Web 应用的录入界面,数据验证是一项重要的实现功能,数据验证是指确认 Web 控件输入或选择的数据&#xff…

类对象作为类成员

在C中,类对象可以作为另一个类的成员变量。这种设计方式可以用于创建复杂的对象结构,使得一个类的对象能够包含另一个类的对象。这种嵌套类的组合方式可以增强代码的可重用性和模块化。 类对象作为类成员的示例 让我们通过一个示例来解释这一概念。假设…

武汉信息系统建设和服务能力评估CS认证咨询

很多企业在咨询信息系统建设和服务能力评估的时候喜欢百度搜索,不管是本地咨询机构还是外地咨询机构只要价格便宜就找谁,这个在低等级的CS1是可以这么操作的,一旦上升到CS2级别及以上的,我们一般不推荐找外地咨询机构,…

【文末附gpt升级方案】字节跳动发布豆包大模型:AI领域的革新与引领

随着科技的飞速进步,人工智能(AI)已逐渐成为推动社会发展的重要力量。在这一背景下,字节跳动公司以其前瞻性的眼光和创新能力,于XXXX年XX月XX日正式发布了豆包大模型,这一举动无疑在AI领域掀起了新一轮的浪…

C语言.动态内存管理

动态内存管理 1.为什么要有动态内存分配2.malloc和free2.1malloc2.2free 3.calloc和realloc3.1calloc3.2realloc 4.常见的动态内存管理的错误4.1对NULL指针解引用操作4.2对动态开辟空间的越界访问4.3对非动态开辟内存使用free释放4.4使用free释放一块动态开辟内存的一部分4.5对…

军训中的美差

大学时候的军训是在二年级秋季开学前进行的,地点是在河北的某部队。 军训时候的分班是按照学号重新划分的,我的学号在大学宿舍八个人中排最后,恰好就和其他宿舍的人分在了一个班。训练正步走的时候,站在我左边的那个哥们&#xf…

Signal 即将成为JavaScript的一部分

什么是响应性? 在过去的几年中,响应性成为了所有现代前端框架以及React库的核心。 对于不熟悉前端开发的人来说,起初这可能是一个令人困惑的概念,因为它改变了常规的、自上而下的、从调用者到被调用者的顺序工作流。 在响应性范…

AR系列路由器配置VLAN间通信

AR路由器是华为公司推出的企业级路由器产品系列,具有高可靠性、高性能和易管理等特点。AR 系列路由器提供的功能包括路由转发、安全接入、语音、视频、无线等多种业务,支持各种接入方式和协议,并且可以方便地进行扩展和升级。 实验拓扑图&…

微信小程序介绍

一、微信小程序概述 微信小程序是一种不需要下载、安装即可使用的应用,用户只需扫一扫或搜一下即可打开。它实现了应用触手可及的梦想,降低了应用的使用门槛。微信小程序自2017年1月上线以来,已经吸引了大量开发者加入,构建了一个…

【全开源】云界旅游微信小程序(源码搭建/上线/运营/售后/维护更新)

开启您的云端旅行新体验 一、引言 在快节奏的现代生活中,旅行成为了人们放松身心、探索世界的重要方式。让您的旅行更加便捷、高效,打造了云界旅游小程序,带您领略云端旅行的无限魅力。 二、小程序功能概览 云界旅游小程序集成了丰富的旅游…

【代码随想录算法训练营第37期 第九天 | LeetCode28. 实现 strStr()、459.重复的子字符串】

代码随想录算法训练营第37期 第九天 | LeetCode28. 实现 strStr()、459.重复的子字符串 一、28. 实现 strStr() 解题代码C&#xff1a; class Solution { public:void getNext(int* next, const string& s) {int j 0;next[0] 0;for(int i 1; i < s.size(); i) {whi…

【Maven】Nexus私服简介_下载安装_登录

1、简介 1.1介绍 Nexus私服&#xff0c;也被称为Maven仓库管理器&#xff0c;是许多公司在自己的局域网内搭建的远程仓库服务器。提供了强大的仓库管理功能和构件搜索功能&#xff0c;使得开发人员能够更方便地管理和使用Maven项目中的依赖库。 1.2作用 内网访问&#xff1…

Python代码:七、小数化整数

1、题目 日常生活中我们会遇到很多小数&#xff0c;但是有的人不喜欢小数&#xff0c;因此会用四舍五入的方式将其去掉。在Python中我们更加简单&#xff0c;可以利用强制类型转换将小数转变成整数&#xff0c;请你试一试。 2、代码 import sysn float(input()) print(int(…

微服务(Spring Clould)--Nacos的安装、配置

简介&#xff1a;&#xff08;取自官网&#xff09; Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称&#xff0c;一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了…

<sa8650>QCX Usecase 使用详解—什么是可剪枝节点属性以及何时使用

<sa8650>QCX Usecase 使用详解—什么是可剪枝节点属性以及何时使用 用例剪枝可实现光流设计分段(节点和目标缓冲区),这些分段实现了共享的逻辑接口,而这些接口的实现可能会发生冲突,但不会重复流水线。例如,overridesettings.txt 中的 enableAutoNoIPE=FALSE。 在 /qc…

《表格革命:数据可视化的力量与创新》

在当今数字化的时代&#xff0c;表格已不再是简单的罗列工具&#xff0c;而是一场正在悄然兴起的革命&#xff01; 表格&#xff0c;这个看似平凡无奇的存在&#xff0c;却在各个领域发挥着至关重要的作用。无论是商业数据分析中精准呈现销售趋势和市场动态&#xff0c;还是学…

React 第三十七章 Scheduler 最小堆算法

在 Scheduler 中&#xff0c;使用最小堆的数据结构在对任务进行排序。 // 两个任务队列 var taskQueue: Array<Task> []; var timerQueue: Array<Task> [];push(timerQueue, newTask); // 像数组中推入一个任务 pop(timerQueue); // 从数组中弹出一个任务 time…

【深入理解MySQL的索引数据结构】

文章目录 &#x1f4d5;索引底层数据结构与算法&#x1f4d9;索引数据结构&#x1f4d8;二叉树&#x1f4d8;红黑树&#x1f4d8;Hash&#x1f4d8;B-Tree&#x1f4d8;BTree &#x1f4d9;表在不同存储引擎的存储结构&#x1f4d8;MyISAM存储引擎索引实现&#x1f4da;文件结构…

C语言如何创建⼀个动态链表?

一、问题 创建动态链表就是指在程序执⾏过程中&#xff0c;从⽆到有&#xff0c;按照需求开辟结点和输⼊各结点数据&#xff0c;并建⽴起前后相连接的关系。那么&#xff0c;如何创建动态链表呢&#xff1f; 二、解答 以建⽴⼀个有任意名学⽣数据的单向动态链表为例&#xff0…