Python构造方法:对象的“开机启动程序”

在Python中,构造方法(__init__)是一个类的“生命之初”,定义了每个对象从“出生”到“投入使用”的整个初始化过程。那既然类里可以直接写属性,为什么还需要构造方法呢?

构造方法的核心作用:创建独一无二的实例

类是模板,而构造方法就是生产线上的“定制工具”。如果一个类是蛋糕模具,那么类属性是模具的“默认样式”,而构造方法则允许我们在生产每个蛋糕时设置独特的配料和装饰

例如:

class Smartphone:# 类属性:品牌(所有手机共享)brand = "Unknown"  # 构造方法:初始化实例的独特属性def __init__(self, model, price):self.model = model   # 每个对象的独特型号self.price = price   # 每个对象的独特价格# 使用构造方法创建不同的手机对象
iphone = Smartphone("iPhone 15", 999)
pixel = Smartphone("Pixel 8", 799)print(iphone.model, iphone.price)  # iPhone 15 999
print(pixel.model, pixel.price)    # Pixel 8 799

如果没有构造方法就只能手动给每个对象添加属性,而不能在创建对象时直接赋值。想想就很麻烦

为什么不能只用类属性?

类属性是共享的资源,而实例属性是独立的空间。

这两者的区别决定了:构造方法的出现是为了让每个实例“与众不同”。

来看一个对比:

类属性:共享数据

class BadDesign:model = "iPhone 15"  # 类属性phone1 = BadDesign()
phone2 = BadDesign()# 修改类属性
phone1.model = "Pixel 8"
print(phone2.model)  # 结果是"Pixel 8"!
问题:类属性是全体实例共享的,修改它会影响所有对象,完全丧失了独特性。

实例属性:独立数据

class GoodDesign:def __init__(self, model):self.model = model  # 实例属性phone1 = GoodDesign("iPhone 15")
phone2 = GoodDesign("Pixel 8")# 修改实例属性
phone1.model = "Galaxy S23"
print(phone2.model)  # 结果仍是"Pixel 8"
结论:实例属性由构造方法初始化,每个对象有自己独立的存储空间,互不干扰。

构造方法的“隐藏技能”

除了初始化实例属性,构造方法还有不少“隐藏用法”,能让对象的创建过程更加灵活和强大:

参数验证:保证数据合法性

class Product:def __init__(self, name, price):if price < 0:raise ValueError("价格不能为负")self.name = nameself.price = pricepython
复制代码
product = Product("Laptop", -500)  # 抛出异常:价格不能为负

执行复杂逻辑:在初始化时完成设置

import timeclass Server:def __init__(self):self.start_time = time.time()  # 记录启动时间self.load_configurations()    # 加载配置文件self.connect_database()       # 连接数据库def load_configurations(self):print("Loading configurations...")def connect_database(self):print("Connecting to database...")
场景: 构造方法在对象创建时自动执行复杂初始化逻辑,无需用户手动调用

依赖注入:灵活传递外部依赖

class Application:def __init__(self, database_client):self.database = database_clientself.cache = {}# 假设我们有一个数据库连接
database_client = {"type": "SQL", "host": "localhost"}
app = Application(database_client)print(app.database)  # {'type': 'SQL', 'host': 'localhost'}
场景: 构造方法可以接收外部依赖,让对象的功能更加模块化。

类属性 vs 构造方法:各司其职

类属性的作用

  1. 共享信息: 适合存储所有实例共享的数据(如“品牌”、“版本号”等)。
  2. 减少存储: 类属性只占用一份内存,节约资源。

构造方法的作用

  1. 初始化实例: 为每个对象设置独特的属性,避免共享冲突。
  2. 保证一致性: 自动在对象创建时执行,不需要额外调用。
  3. 灵活扩展: 可用来验证数据、加载配置、初始化依赖等。

构造方法的地位不可动摇

类属性是“全员通用的基因”,而构造方法是“成长的必经之路”。构造方法为每个实例赋予独特的“身份”,确保对象在初始化时已经是完整且正确的。它不仅仅是个简单的初始化工具,还能执行复杂逻辑、验证数据、注入依赖,让对象的创建更加智能化。

类属性负责“模具的整体设计”,而构造方法则负责“定制每一个成品的细节”。

所以,当你写类时,不要犹豫,给它一个优雅的__init__方法!✨

制作不易,如有帮助,记得点赞关注~ 我是旷野,探索无尽技术!

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

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

相关文章

Superset 和 Appsmith的对比

对于报表数据需要给到前端进行定制化展示&#xff0c;并且直接提供基于报表的 API 让前端调用&#xff0c;以下是对 Superset 和 Appsmith 的对比分析&#xff1a; 1. Apache Superset API 支持 Superset 提供 REST API 接口&#xff0c;可以让前端调用获取报表数据。前端可以…

idea | maven项目标红解决方案 | 强制刷新所有依赖

场景&#xff1a;父pom多模块&#xff0c;新增时&#xff0c;依赖正常&#xff0c;但是application.yml看起来没被springboot识别&#xff0c;试过rebuild、重开idea清除缓存&#xff0c;重新maven面板reload all maven projects, 试过pom文件的依赖先移除再重新粘贴导入进来&a…

Nginx常用配置详解(1)

Nginx常用配置详解 一、全局块&#xff08;main&#xff09;配置 在Nginx的配置文件中&#xff0c;最外层的部分是全局块。这部分配置通常会影响Nginx服务器整体的运行参数。 worker_processes 作用&#xff1a;这个配置指令用于指定Nginx工作进程的数量。工作进程是Nginx处理…

单幅图像合成 360° 3D 场景的新方法:PanoDreamer,可同时生成全景图像和相应的深度信息。

论文介绍了一种从单幅图像合成 360 3D 场景的新方法。该方法以连贯的方式生成全景图及其相应的深度&#xff0c;解决了现有最先进方法&#xff08;如 LucidDreamer 和 WonderJourney 的局限性。这些方法按照生成轨迹依次添加细节&#xff0c;通常在循环回输入图像时导致可见的接…

Linux —— 管理进程

一、查看进程 运行态&#xff08;Running&#xff09; 定义&#xff1a;处于运行态的进程正在 CPU 上执行指令。在单 CPU 系统中&#xff0c;同一时刻只有一个进程处于运行态&#xff1b;在多 CPU 或多核系统中&#xff0c;可能有多个进程同时处于运行态。示例&#xff1a; 当…

Kubernetes中subPath

在Kubernetes&#xff08;K8s&#xff09;中&#xff0c;当容器关闭时&#xff0c;其使用的subPath目录的清理行为取决于几个因素。首先&#xff0c;subPath允许Pod中的容器挂载共享卷的一个子目录&#xff0c;而不是整个卷。这种机制有助于避免不同容器间的文件冲突。 容器关闭…

前端(组件传参案例)

父组件(商品详情页) 子组件上边放大图 底下缩小轮播图 需求分析&#xff1a;父组件获取图片数据&#xff0c;传给底下子组件进行进行轮播&#xff0c;实现父组件给子组件传参。然后底下子组件轮播后&#xff0c;把当前图片下标给父组件&#xff0c;实现子组件给父组件传参。父组…

Linux基础 -- 查看程序注册了的信号的方案

程序注册了哪些信号的方案 方法 1&#xff1a;使用 strace 动态追踪信号处理注册 strace 是一个强大的工具&#xff0c;可以动态捕获程序对信号的处理注册行为&#xff08;如 sigaction 或 signal 系统调用&#xff09;。 示例 启动程序并追踪信号注册&#xff1a; strace…

数据库设计的四大原则:优化性能、保证一致性与高效处理

目录 一. 数据冗余最小化 二. 数据一致性 三. 事务处理 四. 查询性能优化 数据库设计不仅是关于创建表和字段的简单任务&#xff0c;更是构建一个高效运行、易于维护且能够确保数据一致性的系统的核心。一个好的数据库设计不仅能提升应用程序的性能&#xff0c;还能为未来的…

What‘s Next on TON 成都站|聚焦生态创新,共享技术前沿

2024 年&#xff0c;TON 生态为何持续吸引全球开发者和用户的关注&#xff1f;在经历了一系列重要的技术更新和生态扩展后&#xff0c;TON 正在迎来一个爆发式增长的阶段。作为全球四城巡回沙龙的第三站&#xff0c;成都站的活动将如何继续推动这一势头&#xff0c;带来哪些不容…

算法-动态数组-62.不同路径

一、题目 二、思路解析 1.思路&#xff1a; 对于找到目的地它的来源主要来源于目的地的上一格和目的地的左一格 2.常用方法&#xff1a; 无 3.核心逻辑&#xff1a; 1.处理边界&#xff1a; a.只向右移动&#xff0c;至始至终只有一条路径 for(int i0;i<m;i){dp[i][0]1; } …

近端策略优化(Proximal Policy Optimization, PPO)详解

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

Windows 系统如何高效搭建 Linux 开发环境,一步步解锁内核源码

每日禅语 人闲桂花落&#xff0c;夜静春山空。月出惊山鸟&#xff0c;时鸣春涧中。人人皆以为王维只是在写自然界景物的美丽&#xff0c;其实这首诗不只体现了自然界的美丽&#xff0c;更是诗人内心的写照&#xff0c;体现了诗人心中禅心与禅境的完美结合。这首诗的境界之所以如…

C++循环斐波那契数列

1.斐波那契数列&#xff0c;又称黄金分割数列、因数学家莱昂纳多斐波那契&#xff08;Leonardoda Fibonacci&#xff09;以兔子繁殖为例子而引入&#xff0c;故又称为“兔子数列”。如果每对兔子&#xff08;一雄一雌&#xff09;每月能生殖一对小兔子&#xff08;一雄一雌&…

2024年A特种设备相关管理证考试题库及A特种设备相关管理试题解析

为了确保特种设备的安全运行&#xff0c;提高特种设备管理人员的专业素质&#xff0c;2024年A特种设备相关管理证考试题库已经更新&#xff0c;并配备了详细的试题解析。以下是从题库中精选的10道试题&#xff0c;每道试题都附有答案和解析&#xff0c;帮助考生更好地理解考试内…

“视觉革命:走进可视化AI识别系统的智能世界

嘿&#xff0c;各位朋友&#xff01;今天咱们来聊聊一个特别酷炫的技术——可视化AI识别系统。想象一下&#xff0c;如果你的手机能够像你一样“看”懂周围的世界&#xff0c;并且还能告诉你它看到了什么&#xff0c;是不是很神奇&#xff1f;没错&#xff0c;这就是可视化AI识…

Kubernetes 生态揭秘:深度剖析服务与流量管理、Pod 创建,以及外部请求的响应之旅

kubernetes&#xff0c;简称为k8s&#xff08;k12345678s&#xff09;。用于自动部署、扩展和管理“容器化&#xff08;containerized&#xff09;应用程序”的开源系统。可以理解成 K8S 是负责自动化运维管理多个容器化程序&#xff08;比如 Docker&#xff09;的集群&#xf…

职场上,如何做好自我保护?

今天我们讨论一个话题&#xff1a;在职场上&#xff0c;如何保护好自己&#xff1f;废话不多说&#xff0c;我们直接上干货。 &#xff08;一&#xff09; 1.时刻准备一点零食或代餐&#xff0c;如果遇到长时间的会议&#xff0c;就补充点能量。代餐最好选流体&#xff0c;这…

【Lua热更新】下篇 -- 更新中

上篇链接&#xff1a;【Lua热更新】上篇 文章目录 三、xLua热更新&#x1f4d6;1.概述&#x1f4da;︎2.导入xLua框架&#x1f516;3. C#调用Lua3.1Lua解析器3.2Lua文件夹的重定向3.3Lua解析器管理器3.4全局变量获取3.5全局函数获取3.6映射到List和Dictionary3.7映射到类3.8映…

Gin-vue-admin(1):环境配置和安装

目录 环境配置如果443网络连接问题&#xff0c;需要添加代理服务器 后端运行前端运行 环境配置 git clone https://gitcode.com/gh_mirrors/gi/gin-vue-admin.git到server文件目录下 go mod tidygo mod tidy 是 Go 语言模块系统中的一个命令&#xff0c;用于维护 go.mod 文件…