类方法中的“self”参数是什么?

2022-09-05 01:01:02

self引用从类创建的特定对象实例。但是,为什么每个方法都必须显式包含为参数呢?self

class MyClass:
    def func(self, name):
        self.name = name

相反,在 Ruby 中,没有 :self

class MyClass
    def func(name)
        @name = name
    end
end

答案 1

您需要使用的原因是因为Python不使用语法来引用实例属性。Python决定以一种使方法所属的实例自动传递但不自动接收的方式执行方法:方法的第一个参数是调用方法的实例。这使得方法与函数完全相同,并将实际名称留给您使用(尽管这是惯例,当您使用其他内容时,人们通常会对您皱眉头。 对代码来说并不特殊,它只是另一个对象。self.@selfself

Python本可以做一些其他的事情来区分普通名称和属性 - 像Ruby这样的特殊语法,或者像C++和Java那样需要声明,或者可能更不同的东西 - 但它没有。Python的全部目的是使事情变得明确,使其明显是什么,尽管它没有完全在任何地方都这样做,但它确实在例如属性方面做到了这一点。这就是为什么分配给实例属性需要知道要分配给哪个实例的原因,这就是为什么它需要 .self.


答案 2

假设您有一个类,其中包含一个定义为以下内容的方法:ClassAmethodA

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

并且是此类的一个实例。ObjectA

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

ClassA.methodA(ObjectA, arg1, arg2)

变量引用对象本身。self