发布时间:2026/8/8 19:55:51
Python面向对象:__init__构造方法的参数与执行 Python面向对象__init__构造方法的参数与执行一、开篇对象诞生的初始化仪式__init__是Python中最常写的魔法方法。每当创建一个类的实例时Python自动调用它来初始化对象的属性。它被称为初始化方法——不是构造函数那是__new__的职责。⌨️ 先看最基本的classUser:def__init__(self,username,email,age18):初始化新用户——设置初始属性self.usernameusername self.emailemail self.ageage self.is_activeTrue# 默认值不需要从参数传入self.login_count0# 初始化为0# 创建实例时自动调用__init__userUser(zhangsan,zstest.com,age25)print(user.username)# zhangsanprint(user.age)# 25print(user.is_active)# True二、__init__的规则详解2.1 参数传递和selfclassProduct:商品类——展示__init__的参数用法def__init__(self,name,price,category通用,*,discount0,stock0): name: 商品名必填 price: 价格必填 category: 分类可选默认通用 discount: 折扣关键字专用参数 stock: 库存关键字专用参数 self.namename self.priceprice self.categorycategory self.discountdiscount self.stockstock# 在__init__中进行参数验证ifprice0:raiseValueError(价格必须大于0)ifdiscount0ordiscount100:raiseValueError(折扣必须在0-100之间)defget_final_price(self):计算折后价returnself.price*(1-self.discount/100)# 各种创建方式p1Product(笔记本电脑,5999)p2Product(鼠标,199,category外设,stock50)p3Product(键盘,899,discount15,stock30)print(fp1:{p1.name}¥{p1.get_final_price():.0f})print(fp3:{p3.name}¥{p3.get_final_price():.0f})2.2 __init__的返回值# ⚠️ __init__必须返回None# 如果返回其他值会报错classDemo:def__init__(self):# return 42 # TypeError: __init__() should return Nonepass# __init__不是用来返回值的# 它的职责只是初始化self的属性# 创建实例的返回值由__new__控制默认就是self2.3 没有__init__的类# 不是所有类都需要__init__classMathUtils:工具类——全是静态方法不需要__init__staticmethoddefadd(a,b):returnabstaticmethoddefmultiply(a,b):returna*bprint(MathUtils.add(3,5))# 8 —— 不需要创建实例classConstants:常量类——只存数据PI3.14159E2.71828print(Constants.PI)# 3.14159 —— 不需要__init__三、__init__中的输入验证importreclassUser:用户类——在__init__中做输入验证def__init__(self,username,email,password,age):# 1. 验证用户名ifnotusernameorlen(username.strip())3:raiseValueError(用户名至少需要3个字符)ifnotusername.isalnum():raiseValueError(用户名只能包含字母和数字)# 2. 验证邮箱email_patternr^[a-zA-Z0-9._%-][a-zA-Z0-9.-]\.[a-zA-Z]{2,}$ifnotre.match(email_pattern,email):raiseValueError(f无效的邮箱格式:{email})# 3. 验证密码强度iflen(password)8:raiseValueError(密码至少需要8个字符)# 4. 验证年龄ifnotisinstance(age,int)orage0orage150:raiseValueError(f无效的年龄:{age})# 验证通过——设置属性self.usernameusername.strip()self.emailemail.lower()self.passwordpassword# 实际项目中应该哈希存储self.ageage# 测试try:userUser(张三,not-an-email,123,-5)exceptValueErrorase:print(f创建失败:{e})try:userUser(zhangsan,zstest.com,secure_password,25)print(f创建成功:{user.username})exceptValueErrorase:print(f创建失败:{e})四、常见模式和最佳实践4.1 提供多种构造方式fromdatetimeimportdatetimeclassEvent:事件类——支持多种创建方式def__init__(self,title,date,description):self.titletitle self.datedate self.descriptiondescription self.created_atdatetime.now()classmethoddeffrom_string(cls,event_string):从字符串创建标题,2024-06-15,描述partsevent_string.split(,)titleparts[0].strip()datedatetime.strptime(parts[1].strip(),%Y-%m-%d)descriptionparts[2].strip()iflen(parts)2elsereturncls(title,date,description)classmethoddeftoday(cls,title,description):创建今天的事件returncls(title,datetime.now(),description)# 多种创建方式e1Event(会议,datetime(2024,6,15),项目评审)e2Event.from_string(团建,2024-07-01,户外烧烤)e3Event.today(日报,写今日工作总结)print(e1.title,e1.date.date())print(e2.title,e2.date.date())print(e3.title,e3.date.date())4.2 __init__中避免复杂操作# ⚠️ __init__应该轻量——只做属性设置和基本验证# 不要在__init__中做耗时操作classDatabaseConnection:数据库连接——__init__只保存参数不连接def__init__(self,host,port,database):self.hosthost self.portport self.databasedatabase self._connectionNone# 延迟连接defconnect(self):显式连接——不在__init__中自动连接print(f连接到{self.host}:{self.port}/{self.database})self._connection已连接def__enter__(self):self.connect()returnselfdef__exit__(self,*args):print(断开连接)self._connectionNone# 使用withDatabaseConnection(localhost,5432,mydb)asdb:print(执行查询...)五、总结__init__是对象初始化的核心方法。它负责将参数转化为实例的初始状态。核心要点__init__不是构造函数——__new__才是__init__是初始化方法必须返回None在__init__中做输入验证——尽早发现错误保持__init__轻量——避免耗时操作延迟到需要时使用classmethod提供替代构造器——给用户多种创建方式✅__init__是你定义如何初始化一个对象的地方——参数检查、默认值、属性绑定。

相关新闻

2026/8/8 19:55:51

5种部署方式对比:Docker、K8s到Helm,NBoost安装最佳实践

5种部署方式对比:Docker、K8s到Helm,NBoost安装最佳实践 【免费下载链接】nboost NBoost is a scalable, search-api-boosting platform for deploying transformer models to improve the relevance of search results on different platforms (i.e. El…

2026/8/8 20:55:54

Windows远程桌面终极解决方案:RDPWrap.ini配置文件完全指南

Windows远程桌面终极解决方案:RDPWrap.ini配置文件完全指南 【免费下载链接】rdpwrap.ini RDPWrap.ini for RDP Wrapper Library by StasM 项目地址: https://gitcode.com/GitHub_Trending/rd/rdpwrap.ini 你是否曾经因为Windows系统更新后远程桌面突然无法使…

2026/8/8 20:55:54

Ookii.Dialogs.WinForms开发者指南:从源码解析到自定义扩展

Ookii.Dialogs.WinForms开发者指南:从源码解析到自定义扩展 【免费下载链接】ookii-dialogs-winforms Awesome dialogs for Windows Desktop applications built with Microsoft .NET (WinForms) 项目地址: https://gitcode.com/gh_mirrors/oo/ookii-dialogs-winf…

2026/8/7 19:43:11

如何用免费工具突破游戏窗口限制:SRWE完整使用指南

如何用免费工具突破游戏窗口限制:SRWE完整使用指南 【免费下载链接】SRWE Simple Runtime Window Editor 项目地址: https://gitcode.com/gh_mirrors/sr/SRWE 你是否遇到过这样的困扰?想为心爱的游戏截图,却发现游戏不支持自定义分辨率…

2026/8/8 0:04:22

Java图像处理实战指南

要执行这些 Java AWT 图像处理程序,你需要将它们分别保存为独立的 .java 文件,并使用 javac 编译,然后使用 java 运行。以下是每个程序的核心执行步骤、依赖关系和要点。 通用执行步骤 保存文件:将每个 listing 的代码复制到文本…

2026/8/8 0:04:23

昇腾AI代理实现多号通话自动化

基于昇腾(Ascend)硬件与AtomGit AI社区的开源生态,结合AI Agent技术,可以实现一个模拟“通话重复使用机号复制”功能的安卓手机应用原型。其核心是利用AI Agent进行意图理解、任务编排和自动化操作,模拟或管理多号码的…

2026/8/8 0:04:23

2026年Graph+AI Agents最新创新思路

本次围绕GraphAI Agents这个方向筛选了15篇高质量论文,都是近年来具有较高引用价值或方法创新的研究工作,其中部分来自IJCAI、AAAI、ICRA。 对于论文er来说,这些论文方法结构清晰、可复现性较强,在多个任务上都有可延展的空间。如…

2026/8/7 9:44:18

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/7 19:03:32

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/8 2:17:42

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…