自我的目的是什么?

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_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变量是指对象本身。

链接地址: http://www.djcxy.com/p/9295.html

上一篇: What is the purpose of self?

下一篇: How to process python generated error messages my own way?