上一篇我们学会了用class关键字定义类、创建对象,其中__init__方法频繁出现,它是类中最核心、最基础的方法,也是新手入门面向对象的第一个“拦路虎”。
很多新手会疑惑:__init__到底是什么?为什么必须写self?创建对象时它会做什么?今天就聚焦__init__构造方法,用“通俗拆解+分步实操+避坑指南”,手把手教你吃透它的用法,夯实Python面向对象基础,新手跟着敲,就能彻底掌握!
📌 核心前提:什么是__init__构造方法?
__init__(双下划线+init+双下划线)是Python类中自带的“初始化方法”,也叫构造方法,它的核心作用是“创建对象时自动执行,为对象绑定属性”。
简单说,__init__就像“对象的出生初始化程序”——我们用class定义好类(模板)后,每次创建对象(实例化),Python都会自动调用__init__方法,帮我们给对象“初始化”好属性,不用手动给每个对象逐一赋值,既高效又规范。
举个通俗的例子:定义一个Student类,我们希望每个学生对象创建时,都自动拥有姓名、年龄、班级这些属性。如果没有__init__,就要在创建对象后,手动给每个对象赋值(比如stu1.name = "小明"),100个对象就要写100行赋值代码;而有了__init__,创建对象时直接传入属性参数,就能自动完成赋值,一步到位。
关键提醒:__init__是Python的内置方法,名字是固定的(必须是__init__,不能写错字母、漏写下划线),且必须定义在类体中,否则无法自动初始化属性。
🔧 全程实操:__init__构造方法的使用(3步搞定)
__init__的使用流程非常固定,核心是“定义方法→绑定属性→创建对象传参”,每一步都有明确的语法规范,新手重点掌握self的用法和参数传递,就能少踩坑。
1. 第一步:在类中定义__init__方法(核心语法)
__init__方法定义在class类体中,位于所有自定义方法之前,核心语法有3个关键要求,缺一不可:
① 方法名必须是__init__(双下划线开头和结尾,中间是init,区分大小写);
② 第一个参数必须是self,代表“当前正在创建的对象”,不可或缺,也不能调换位置;
③ 后续参数是需要给对象绑定的属性,参数名可自定义,建议贴合属性含义(比如name、age)。
基础示例(在Student类中定义__init__方法):
# 用class定义Student类,包含__init__构造方法class Student: # 定义__init__方法,self必传,后续参数为属性 def __init__(self, name, age, class_num): # 给当前对象绑定属性:self.属性名 = 参数 self.name = name # 姓名属性(绑定name参数) self.age = age # 年龄属性(绑定age参数) self.class_num = class_num # 班级属性(绑定class_num参数) # 自定义方法:查看学生信息(调用绑定的属性) def show_info(self): print(f"姓名:{self.name},年龄:{self.age},班级:{self.class_num}")
补充说明:self的作用是“关联对象”,把传入的参数赋值给当前创建的对象,让对象拥有对应的属性。比如创建stu1对象时,self就代表stu1;创建stu2对象时,self就代表stu2,无需手动传递。
2. 第二步:创建对象,传递属性参数
定义好__init__方法后,创建对象时,必须传入__init__方法中除self外的所有参数(参数数量、类型要一致),Python会自动调用__init__,将参数传递给对应的属性,完成对象初始化。
核心格式:对象名 = 类名(参数1, 参数2, ...)(无需传递self)
示例(基于上面的Student类,创建2个学生对象):
# 实例化第一个对象:小明,传入姓名、年龄、班级参数stu1 = Student(name="小明", age=15, class_num="初一(1)班")# 实例化第二个对象:小红,传入对应参数stu2 = Student(name="小红", age=15, class_num="初一(1)班")
注意:创建对象时,参数传递有两种方式——关键字参数(如name="小明",推荐,清晰不易出错)和位置参数(如Student("小明", 15, "初一(1)班"),需和__init__参数顺序一致)。
此时,stu1和stu2两个对象已经通过__init__方法,自动绑定了name、age、class_num属性,无需再手动赋值,直接就能使用。
3. 第三步:调用对象属性和方法(验证效果)
对象初始化完成后,我们可以通过“对象名.属性名”获取属性值,通过“对象名.方法名()”调用方法,验证__init__绑定属性的效果,操作和上一篇一致。
示例(操作stu1、stu2对象):
# 1. 调用对象的属性(直接获取,无需手动赋值)print("小明的信息:", stu1.name, stu1.age, stu1.class_num)# 输出:小明的信息: 小明 15 初一(1)班# 2. 修改对象的属性值(个性化调整)stu1.age = 16 # 将小明的年龄修改为16岁print("修改后小明的年龄:", stu1.age) # 输出:修改后小明的年龄: 16# 3. 调用方法,查看完整信息stu2.show_info() # 输出:姓名:小红,年龄:15,班级:初一(1)班
小技巧:如果想给属性设置默认值,可在__init__方法中给参数赋值(比如def __init__(self, name, age, class_num="初一(1)班")),创建对象时,该参数可省略,使用默认值。
❌ 新手必避的5个__init__使用坑(附解决方案)
__init__是新手最容易踩坑的地方,很多报错都和它有关,以下5个常见坑,每个都附具体解决方案,遇到直接对照解决,节省调试时间。
坑1:__init__方法名写错(比如漏写下划线、写成init、Init),导致创建对象时不自动执行。 解决方案:严格记住方法名是__init__(双下划线+init+双下划线),字母全小写,不能有任何拼写错误。
坑2:__init__方法漏写self参数,或self参数位置不是第一个,导致创建对象时报错。 解决方案:self是__init__的第一个必传参数,不可或缺,也不能调换位置,哪怕没有其他属性参数,也要写def __init__(self):。
坑3:创建对象时,漏传__init__要求的属性参数,导致报错“缺少位置参数”。 解决方案:创建对象时,必须传入__init__方法中除self外的所有参数,若有默认值的参数,可根据需求省略。
坑4:在__init__方法中,绑定属性时漏写self(比如写成name = name),导致属性绑定失败,调用时报错。 解决方案:绑定属性的格式必须是“self.属性名 = 参数”,self不能漏,否则属性会变成局部变量,对象无法访问。
坑5:手动调用__init__方法,导致对象属性被重复赋值、逻辑混乱。 解决方案:__init__是创建对象时自动调用的,无需手动调用(比如stu1.__init__("小明", 15, "初一(1)班")),手动调用会导致属性重复赋值,引发异常。
💡 实战案例:完整演示__init__构造方法的使用
结合上面的知识点,我们做一个完整实战:用class定义一个“商品类”,通过__init__方法绑定商品属性,创建对象并操作,新手跟着操作,就能彻底掌握__init__的用法。
# 1. 定义商品类,包含__init__构造方法class Goods: # 初始化属性:商品名称、价格、库存,库存设置默认值100 def __init__(self, name, price, stock=100): self.name = name # 商品名称 self.price = price # 商品价格 self.stock = stock # 商品库存(默认100) # 方法1:查看商品信息 def show_goods(self): print(f"商品名称:{self.name},价格:{self.price}元,库存:{self.stock}件") # 方法2:修改商品库存 def change_stock(self, new_stock): self.stock = new_stock print(f"{self.name}的库存已修改为:{self.stock}件")# 2. 创建2个商品对象(第二个对象省略库存参数,使用默认值)goods1 = Goods(name="Python教程", price=59.9, stock=50)goods2 = Goods(name="数据线", price=19.9)# 3. 调用对象的属性和方法# 查看商品信息goods1.show_goods() # 输出:商品名称:Python教程,价格:59.9元,库存:50件goods2.show_goods() # 输出:商品名称:数据线,价格:19.9元,库存:100件# 修改库存goods2.change_stock(80) # 输出:数据线的库存已修改为:80件print("数据线修改后库存:", goods2.stock) # 输出:数据线修改后库存: 80
运行代码后,能看到两个商品对象都通过__init__自动绑定了属性,其中goods2省略了库存参数,使用了默认值100,完全符合我们的预期。这就是__init__的核心价值:简化对象初始化,让代码更简洁、更规范。
📝 核心总结
__init__构造方法是Python面向对象的基础,也是每个类的“必备组件”,核心要点总结:
1. 本质:Python内置的初始化方法,创建对象时自动执行,核心作用是给对象绑定属性;
2. 语法:def __init__(self, 参数1, 参数2, ...): ,self必传且在第一个位置,后续参数对应对象属性;
3. 用法:创建对象时传入参数,自动完成属性绑定,无需手动赋值;
4. 避坑关键:记对方法名、不遗漏self、不手动调用、参数传递完整。
对于新手来说,掌握__init__是学好面向对象的关键一步,它看似简单,但细节很多,多敲几个案例(比如动物类、汽车类),熟练掌握参数传递和属性绑定,就能为后续学习类的继承、封装打下坚实基础。
✨ 小任务:用class定义一个“图书类”,通过__init__方法绑定书名、作者、出版社3个属性(出版社设为默认值),创建2个图书对象,调用方法查看信息并修改出版社。
读懂代码的骨架,驾驭AI的血肉,做数字时代的超级个体🔥