Python中self这个词的目的是什么?我知道它是指从该类创建的特定对象,但是我看不到为什么需要将它作为参数显式添加到每个函数中。为了说明这一点,在Ruby中,我可以这样做:
Ruby
class myClass def myFunc(name) @name = name end end
我很容易理解。但是在Python中,我需要包括self:
self
class myClass: def myFunc(self, name): self.name = name
让我们看一个简单的向量类:
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_global v = 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编写实例方法;你编写的是必须将实例作为第一个参数的类方法。因此,你必须将实例参数显式放置在某处。
需要使用self的原因.是因为Python不使用@语法来引用实例属性。Python决定以一种使该方法所属的实例自动传递但不会自动接收的方式进行方法:方法的第一个参数是调用该方法的实例。这使方法与函数完全相同,并保留实际名称供您使用(尽管self是约定俗成,当您使用其他东西时,人们通常会皱着眉头。)self对于代码而言并不特殊,它只是另一个对象。
Python可以做一些其他事情来区分普通名称和属性-像Ruby这样的特殊语法,或者像C ++和Java这样的声明都需要,或者也许还有其他不同-但事实并非如此。Python的全部目的是使事情变得明确,使事情变得显而易见,尽管它并非在所有地方都做到这一点,但它确实为实例属性做到了。这就是为什么分配给实例属性需要知道要分配给哪个实例的原因,这就是为什么需要它的原因self.。