You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 05:27:36