在 Python 中,self 并不是语言关键字,而是实例方法中第一个参数的约定名称,指向调用该方法的实例对象。它的显式存在集中体现了 Python 的核心设计哲学:显式优于隐式、一切皆对象,以及简洁一致的调用模型。
一、self 的本质是什么
首先要知道的是,self 不是 Python 的关键字,也没有任何特殊语法含义。它只是实例方法中第一个参数的惯用名称,用于表示'当前对象的实例引用'。
例如:
class Dog:
def bark(self):
print("Woof!")
当我们执行:
d = Dog()
d.bark()
Python 实际上在内部做了如下调用:
Dog.bark(d)
也就是说,self 就是调用该方法的对象实例 d。因此,bark() 方法能通过 self 访问对象的属性和其他方法。
二、为什么必须显式写出 self
很多面向对象语言(如 Java、C++)中有一个隐藏参数 this,它在方法中自动存在。Python 没有这样做,原因在于它的'一切皆对象'哲学:方法本质上就是函数对象,只是存放在类的命名空间中。
Python 不希望让'方法'成为一种特殊语法,而是通过普通函数与对象绑定的机制来实现方法调用。这种设计让函数、类、实例三者的关系更透明、更灵活。
Python 不会自动注入'实例引用',必须显式声明第一个参数,社区约定俗成地命名为 self。
这使得方法调用规则简单且一致:任何函数若绑定到实例上,其第一个参数都会接收实例对象。
三、方法的绑定机制:self 如何被传入
要理解 self,首先需要了解方法在 Python 中是如何被绑定的。
当我们通过 实例。方法 的方式访问一个方法时,Python 会执行以下步骤:
- 在实例所属的类中查找该方法对应的函数对象。
- 如果找到该函数对象 f,则触发其 get() 方法(这是通过描述符机制实现的)。
- get() 方法会返回一个绑定方法(bound method)对象,该对象内部保存了当前实例的引用。
- 当我们调用这个绑定方法时,Python 会自动将保存的实例作为第一个参数(即 self)传入原函数。
示例说明:
class A:
def show(self, x):
print(self, x)
a = A()
a.show(10)
上述调用实际上等价于:
A.show(a, 10)
也就是说:
- 通过实例访问方法时,会得到一个已绑定实例的'绑定方法',调用时自动传入 self。
- 通过类访问方法时,得到的仍是一个普通函数,调用时需要显式传入实例作为 self。
四、三种方法绑定的比较
Python 中存在三种类型的方法绑定方式:

