让我们来看一个简单的向量类:
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)
所以整个结构保持不变。我们如何利用这一点?如果我们假设我们没有为我们的Vector类编写length
方法,我们可以这样做:
因此,整个结构保持不变。我们如何利用这一点呢?如果我们暂时假设我们为Vector
类没有编写length
方法,那么我们可以这样做:
Vector.length_new = length_global
v = Vector(3, 4)
print(v.length_new())
这段代码的工作原理是,length_global
的第一个参数可以被重新用作 length_new
的 self
参数。如果没有显式的 self
,这将不可能实现。
另一种理解需要显式 self
的方法是查看 Python 添加一些语法糖的情况。当你记住基本上像下面这样调用:
v_instance.length()
被内部转换为
Vector.length(v_instance)
很容易看出self
的作用。在Python中,您实际上不会编写实例方法;您编写的是类方法,其必须将实例作为第一个参数。因此,您需要明确地将实例参数放在某个位置。
@name
比self.name
更直观?在我看来,后者更加直观。而且我也很容易理解。 - Santa