Python中为何必须使用self?解析其内部逻辑
Python中self的作用与内部逻辑
先看你遇到的问题:第二个代码之所以报错,是因为你在__init__里定义的name和roll是方法内部的局部变量,方法执行结束后这些变量就会被销毁,实例ram根本无权访问它们。而第一个代码里用self绑定的变量,才是属于实例自身的属性。
到底什么是self?
在Python的类中,所有实例方法(比如__init__)的第一个参数必须是self(这个名字只是约定俗成,换成别的也能运行,但行业里都默认用self),它代表当前调用该方法的实例对象本身。
当你执行ram = Student("Ram", 1)时,Python其实在背后做了这件事:
ram = Student() # 先创建一个空实例 Student.__init__(ram, "Ram", 1) # 自动把实例作为第一个参数传给__init__
也就是说,self就是ram这个实例在方法里的“代称”。
为什么必须用self?
- 绑定实例属性:用
self.属性名 = 值的方式,是把值绑定到当前实例上,变成这个实例独有的属性。每个实例可以有自己独立的属性值,比如你再创建一个shyam = Student("Shyam", 2),shyam.name和ram.name就是完全独立的两个值。 - 区分局部变量与实例属性:如果不用self,方法里定义的变量只是局部变量,和实例无关,实例访问不到。就像你第二个代码里的情况,
name和roll只在__init__执行时存在,执行完就没了,ram自然找不到这些属性。 - 在类的其他方法中访问实例状态:比如你给Student加一个打印信息的方法,也需要通过self来访问当前实例的属性:
class Student: def __init__(self, name1, roll1): self.name = name1 self.roll = roll1 def print_info(self): print(f"姓名:{self.name},学号:{self.roll}") ram = Student("Ram", 1) ram.print_info() # 输出:姓名:Ram,学号:1
总结
self就是实例在类方法里的“替身”,通过它你才能把数据绑定到实例上,让每个实例拥有自己的状态,也能在类的各个方法里操作这些状态。没有self,类的方法就无法和具体的实例关联起来,自然也没法实现面向对象的核心功能——封装实例的属性和行为。
内容的提问来源于stack exchange,提问作者SSR
相关产品推荐
相关产品推荐

