一文读懂Python的`__init__`,`__init__`方法的终极指南

大家好,今天给大家介绍一个Python中一个特殊的函数__init__

在Python中,__init__方法是一个特殊的函数,它在创建类的新实例时自动调用。它的作用类似于其他编程语言中的构造函数,用于初始化对象的状态。这篇文章将带你深入了解__init__的用法,并通过生动的案例,让你轻松掌握这个概念。

image-20240422103246567

概念和原理

__init__是什么?

__init__是一个特殊的方法,也称为类的构造器,用于创建对象时初始化对象的属性。当创建一个类的新实例时,__init__ 方法会被自动调用。它的主要作用是初始化新创建的对象的属性。想象你在制作一台机器时的装配线,__init__方法就是你启动机器、设置初值的过程。

class Car:def __init__(self, make, model):self.make = makeself.model = model

在上面的例子中,每当Car类实例化时,__init__方法都会被调用,makemodel属性会被设置。

为什么要使用__init__

使用__init__方法可以方便地为对象设置初始状态。例如,当你创建一个表示人的类时,你可能需要记录人的名字和年龄,这些信息就可以通过__init__方法来设置。

__init__ 方法的原理

每次你创建一个类的实例时,Python 会首先调用这个类的 __init__ 方法。这个方法可以有多个参数,这些参数通常用来提供初始化对象所需的数据。self 参数是必须的,它代表了类的当前实例,通过它你可以访问类的属性和其他方法。

案例演示

基础案例

让我们通过一个简单的例子来看看 __init__ 方法是如何工作的:

class Person:def __init__(self, name, age):self.name = nameself.age = age# 创建一个 Person 类的实例
p = Person("John", 30)# 访问实例属性
print(p.name)  # 输出: John
print(p.age)   # 输出: 30

在这个例子中,Person 类有两个属性:nameage__init__ 方法接受这两个属性的初始值作为参数,并将它们分别赋值给 self.nameself.age

__init__ 中使用默认参数

我们可以在 __init__ 方法中使用默认参数来提供默认值:

class Person:def __init__(self, name, age=35):self.name = nameself.age = age# 不提供年龄时使用默认值
p1 = Person("Alice")
print(p1.name, p1.age)  # 输出: Alice 35# 提供年龄时覆盖默认值
p2 = Person("Bob", 25)
print(p2.name, p2.age)  # 输出: Bob 25

__init__ 方法中的高级应用

__init__ 方法也可以用来进行更复杂的初始化操作,比如创建其他对象、初始化复杂的数据结构等。

class Team:def __init__(self, members):self.members = [Person(name) for name in members]team = Team(["Alice", "Bob", "Charlie"])
for member in team.members:print(member.name)  # 输出 Alice, Bob, Charlie 的名字

在这个高级示例中,Team 类的 __init__ 方法接收一个成员名称列表,并为每个成员名称创建一个 Person 实例。

使用super()调用父类的__init__

当你的类继承自另一个类时,你可能需要调用父类的__init__方法来确保父类也被正确地初始化。

class Employee(Person):def __init__(self, name, age, job_title):super().__init__(name, age)self.job_title = job_title# 创建一个Employee对象
employee = Employee('Bob', 25, 'Developer')
print(employee.name)      # 输出: Bob
print(employee.age)       # 输出: 25
print(employee.job_title) # 输出: Developer

使用__init__接受可变数量的参数

有时你可能需要一个方法能够接受任意数量的参数,这可以通过*args**kwargs实现。

class FlexibleInit:def __init__(self, *args, **kwargs):for arg in args:print(arg)for key, value in kwargs.items():print(f"{key}: {value}")# 创建对象时传入任意数量的参数
obj = FlexibleInit(1, 2, 3, name='Alice', age=25)

__init__方法是Python中类的一个核心概念,它为对象的创建和初始化提供了强大的支持。通过上述的案例,你应该对如何使用__init__有了清晰的认识。记住,无论是简单的对象属性设置,还是复杂的继承和参数处理,__init__都是你创建和管理Python对象的好帮手。

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

python实现的信号合成分析系统(DSP)

python实现的信号合成分析系统(DSP) 流程 1、在QT界面上设置好信号频率,采样频率,采样点数 2、使用np构建sin函数 3、使用matplotlib画出 4、分别分析合成信号的FFT频域信息1、效果图 2、示例代码 def btn_com_clicked(self):# 信号合成分析Fs = self.com_fs_edit_value #…

【网络编程】http协议

预备知识 什么是http协议 HTTP(Hypertext Transfer Protocol,超文本传输协议)是一个应用层的协议,用于在网络中传输超文本(如HTML文档)。HTTP协议建立在TCP/IP协议之上,是Web浏览器和Web服务器…

Map集合的实现类~HashMap

存储结构:哈希表 键重复依据是hashCode和equals方法(键不能重复) 添加: 先创建Student类,那么往HashSet添加的就是Student对象作为键值,后面的作为值 删除: 判断: 遍历&#xff1a…

为什么要梯度累积

文章目录 梯度累积什么是梯度累积如何理解理解梯度累积梯度累积的工作原理 梯度累积的数学原理梯度累积过程如何实现梯度累积 梯度累积的可视化 梯度累积 什么是梯度累积 随着深度学习模型变得越来越复杂,模型的训练通常需要更多的计算资源,特别是在训…

self-attention 的 CUDA 实现及优化 (上)

self-attention 的 CUDA 实现及优化 (上) 导 读 self-attention 是 Transformer 中最关键、最复杂的部分,也是 Transformer 优化的核心环节。理解 self-attention ,对于深入理解 Transformer 具有关键作用,本篇主要就围绕 self-attention 展…

java+jsp+Oracle+Tomcat 记账管理系统论文(完整版)

⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️ ➡️点击免费下载全套资料:源码、数据库、部署教程、论文、答辩ppt一条龙服务 ➡️有部署问题可私信联系 ⬆️⬆️⬆️​​​​​​​⬆️…

ThingsBoard版本控制配合Gitee实现版本控制

1、概述 2、架构 3、导出设置 4、仓库 5、同步策略 6、扩展 7、案例 7.1、首先需要在Giitee上创建对应同步到仓库地址 ​7.2、giit仓库只能在租户层面进行配置 7.3、 配置完成后:检查访问权限。显示已成功验证仓库访问!表示配置成功 7.4、添加设…

鸿蒙OpenHarmony南向:【Hi3516标准系统入门(命令行方式)】

Hi3516标准系统入门(命令行方式) 注意: 从3.2版本起,标准系统不再针对Hi3516DV300进行适配验证,建议您使用RK3568进行标准系统的设备开发。 如您仍然需要使用Hi3516DV300进行标准系统相关开发操作,则可能会…

【Linux】文件内容相关的命令,补充:管道符

1、查看文件内容 (1-1)查看文件内容:cat,tac,head,tail 查看文件内容cat 文件名查看文件内容并显示行号cat -n 文件名倒着查看文件内容(从最后一行开始)tac 文件名查看文件前10行…

力扣hot100:543. 二叉树的直径/108. 将有序数组转换为二叉搜索树

一、543. 二叉树的直径 LeetCode:543. 二叉树的直径 二叉树的直径 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。 遇到二叉树的问题很容易去直接用求解的目标去定义递归函数。但是仔细考虑,返回树的直径并不能向上传播。因此我们可以拆…

SolidWorks进行热力学有限元分析二、模型装配

1.先打开软件,新建装配体 2.选中你要装配的零件,直接导入就行 3.鼠标点击左键直接先放进去 4.开始装配,点配合 5.选择你要接触的两个面,鼠标右键确定,然后把剩下的面对齐一下就行了 6.搞定

学习《现代密码学——基于安全多方计算协议的研究》 第一章

目录 前言 第1章 绪论 1.1 密码学的发展历史 1.2 现代密码学体制 1.3 现代密码学与安全多方计算 前言 近几年来,云计算、物联网、移动互联网等新概念、新技术被先后提出,促使信息技术飞速发展。同时,人类生活、沟通方式也随着新技术的普及…

泰克MDO3024示波器如何调整衰减倍数?

泰克MDO3024示波器是一款高性能的数字示波器,具备多种功能和调节选项,可以满足各种测试需求。其中一个重要的调节选项就是调整衰减倍数,通过调整衰减倍数,可以改变示波器的灵敏度和测量范围,帮助我们更好地观察和分析信…

奇诡 matlab 小 bug matlab git需要记录的改动太多

似乎是我有一次添加了太多的路径之后的事情。但是不敢说一定是这个导致的: 症状:只要对文本进行任何编辑操作,工作区就会出现"Processing … Cancel"的提示,如果不管的话这个提示不会消失,同时matlab变得越来…

【进程终止】退出信号 | 三种退出情况 | 如何进程终止returnexit_exit

目录 退出码 退出信号 进程终止情况3 如何进程终止 return退出 库函数exit 系统调用函数_exit ​exit和_exit的区别缓冲区 exit _exit 退出码 回顾上篇 代码跑完,结果正确(退出码为0)代码跑完,结果不正确(退…

springboot项目组合定时器schedule注解实现定时任务

springboot项目组合定时器schedule注解实现定时任务! 创建好springboot项目后,需要在启动类上增加注解开启定时器任务 下图所示: 增加这个注解,启动项目, package com.example.scheduledemo.util;import org.springf…

Linux进程通信-信号

信号概念 信号是 Linux 进程间通信的最古老的方式之一,是事件发生时对进程的通知机制,有时也称之为软件中断,它是在软件层次上对中断机制的一种模拟,是一种异步通信的方式。信号 可以导致一个正在运行的进程被另一个正在运行的异…

企业怎样进行IT外包以及IT外包服务内容

在数字化时代的浪潮中,企业逐渐认识到信息技术的关键作用,特别是制造业基地对于IT外包和运维服务的需求持续增长。然而,在诸多可供选择的IT外包和运维方案中,企业如何推动与IT外包公司的合作?本文将深入介绍IT外包方案…

nginx 启动,查看,停止

nginx 启动,查看,停止 启动 start nginx 查看是否启动成功 tasklist | findstr nginx 停止 nginx -s stop 测试配置文件的语法是否有误 nginx -t 重启nginx nginx-s reload

网络安全之动态路由OSPF基础

OSPF:开放式最短路径优先协议。 1、协议使用范围:IGP。 2、协议算法特点:链路状态型路由协议。 3、协议是否传递网络掩码:传递网络掩码(无类别的路由协议)。 4、协议封装:基于IP协议封装&am…