Python类中为何需同时使用__init__与self?方法必带self的疑问
Python OOP中__init__与self的常见疑问解答
一、为什么Python类中要同时用__init__和self?
首先得明确:__init__不是构造函数,它是实例初始化方法——当Python通过__new__创建出类的实例后,__init__会自动被调用,用来给这个实例初始化专属属性。
而self就是这个刚创建出来的实例本身的引用。如果在__init__里不用self绑定属性,那你定义的属性会变成类属性,被所有实例共享;只有通过self.属性名 = 值,才能把属性绑定到当前实例上,让每个实例拥有独立的属性值。
举个直观的例子:
# 错误写法:name是类属性,所有实例共享 class Person: def __init__(name): name = name # 正确写法:用self绑定实例属性,每个实例独立拥有 class Person: def __init__(self, name): self.name = name p1 = Person("Alice") p2 = Person("Bob") print(p1.name) # 输出Alice print(p2.name) # 输出Bob
如果不用self,p1和p2的name会是同一个值,完全失去了实例的独立性。
二、为什么定义OOP方法时每次都必须带上self?
这是Python的显式实例传递规则:当你调用实例.方法()的时候,Python会自动把这个实例作为第一个参数传递给方法。所以你在定义方法时,必须留一个参数位置来接收这个实例——self就是大家约定俗成的参数名(换成this也能跑,但不符合Python编码规范,不推荐)。
比如你写:
class Person: def __init__(self, name): self.name = name def say_hello(self): print(f"Hello, I'm {self.name}") p = Person("Alice") p.say_hello()
实际Python执行的是Person.say_hello(p),如果定义方法时没写self,调用时就会出现“方法需要0个参数,但传入了1个”的错误。
简单说,self就是用来在方法内部指代当前调用这个方法的实例,让方法能访问到实例的属性和其他方法。
内容的提问来源于stack exchange,提问作者Harsh Raj
相关产品推荐
相关产品推荐

