让我们看一个简单的向量类:
class Vector: def __init__(self, x, y): self.x = x self.y = y
我们希望有一种计算长度的方法。如果我们想在类中定义它,它将是什么样?
def length(self): return math.sqrt(self.x ** 2 + self.y ** 2)
当我们将其定义为全局方法/函数时,它应该是什么样?
def length_global(vector): return math.sqrt(vector.x ** 2 + vector.y ** 2)
因此,整个结构保持不变。我该如何利用呢?如果暂时假设我们没有length为Vector类编写方法,则可以执行以下操作:
Vector.length_new = length_globalv = Vector(3, 4)print(v.length_new()) # 5.0
之所以有效,是因为的第一个参数length_global可以用作中的self参数length_new。没有明确的指示,这将不可能self。
理解显式需求的另一种方法self是查看Python在何处添加了一些语法糖。当你牢记时,基本上,
v_instance.length()
在内部转换为
Vector.length(v_instance)
很容易看到self适合的位置。你实际上并没有用Python编写实例方法;你编写的是必须将实例作为第一个参数的类方法。因此,你必须将实例参数显式放置在某处。



