协慌网

登录 贡献 社区

自我的目的是什么?

Python 中self字的目的是什么?我理解它指的是从该类创建的特定对象,但我不明白为什么它明确需要作为参数添加到每个函数。为了说明,在 Ruby 中我可以这样做:

class myClass
    def myFunc(name)
        @name = name
    end
end

我很容易理解。但是在 Python 中我需要包括self

class myClass:
    def myFunc(self, name):
        self.name = name

谁能跟我说说这个?这不是我在(无可否认有限的)经历中遇到的事情。

答案

你需要使用self.的原因self.是因为 Python 不使用@语法来引用实例属性。 Python 的决定做方法的方式,使该实例该方法属于自动传递 ,但不自动收到 :方法的第一个参数是实例的方法被调用。这使得方法与函数完全相同,并且留下实际名称以供您使用(尽管self是惯例,当您使用其他东西时,人们通常会对您不满。) self对代码并不特殊,它只是另一个对象。

Python 可以做其他事情来区分普通名称和属性 - 像 Ruby 这样的特殊语法,或者需要像 C ++ 和 Java 那样的声明,或者可能是更不同的东西 - 但事实并非如此。 Python 的所有内容都是为了使事情变得明确,让它显而易见的是什么,虽然它并不是完全无处不在,但它确实是为了实例属性。这就是为什么分配一个实例属性需要知道要分配的实例,这就是为什么它需要self.

我们来看一个简单的矢量类:

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_new = length_global
v = Vector(3, 4)
print(v.length_new()) # 5.0

这是有效的,因为length_global的第一个参数可以重新用作length_newself参数。没有明确的self这是不可能的。


另一种理解显式self是看 Python 在哪里添加一些语法糖。当你记住,基本上,一个电话就像

v_instance.length()

内部转变为

Vector.length(v_instance)

很容易看出self适合的位置。你实际上并没有在 Python 中编写实例方法; 你写的是类方法,它必须将实例作为第一个参数。因此,您必须明确地将实例参数放在某处。

假设你有一个ClassA类,它包含一个方法methodA定义如下:

def methodA(self, arg1, arg2):
    # do something

ObjectA是此类的一个实例。

现在,当ObjectA.methodA(arg1, arg2) ,python 会在内部将其转换为:

ClassA.methodA(ObjectA, arg1, arg2)

self变量指的是对象本身。