考虑这个例子:
class MyClass:
def func(self, name):
self.name = name
我知道 self
是指 MyClass
的具体实例。但为什么必须 func
明确包含 self
作为参数?为什么我们需要在方法的代码中使用 self
?其他一些语言使这成为隐含的,或者使用特殊的语法。
有关设计决策的与 语言无关 的考虑,请参阅 强制显式 this/self 指针的优势是什么? .
要关闭 OP 省略 self
方法参数并获得 TypeError
的 _调试问题_,请使用 TypeError: method() 采用 1 个位置参数,但给出了 2 个。如果 OP 在方法体中省略了 self.
并得到了 NameError
,请考虑 如何在类中调用函数? .
原文由 richzilla 发布,翻译遵循 CC BY-SA 4.0 许可协议
之所以需要使用
self.
是因为 Python 不使用特殊语法来引用实例属性。 Python 决定以一种使方法所属的实例自动 传递 但不自动 接收 的方式来执行方法:方法的第一个参数是调用该方法的实例。这使得方法与函数完全一样,并留给您使用实际名称(尽管self
是惯例,当您使用其他东西时人们通常会皱眉头。)self
对代码来说并不特殊,它只是另一个对象。Python 本可以做一些别的事情来区分普通名称和属性——像 Ruby 那样的特殊语法,或者像 C++ 和 Java 那样需要声明,或者更不同的东西——但它没有。 Python 完全是为了让事情变得明确,让事情变得显而易见,尽管它并不完全在任何地方都这样做,但它确实可以为实例属性做到这一点。这就是为什么分配给实例属性需要知道要分配给哪个实例,这就是为什么它需要
self.
。