\`self\` 参数的用途是什么?为什么需要它?

新手上路,请多包涵

考虑这个例子:

 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 许可协议

阅读 548
2 个回答

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

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

原文由 Thomas Wouters 发布,翻译遵循 CC BY-SA 4.0 许可协议

假设您有一个类 ClassA 其中包含一个方法 methodA 定义为:

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

objectA 是此类的一个实例。

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

 ClassA.methodA(objectA, arg1, arg2)

self 变量指的是对象本身。

原文由 Arjun Sreedharan 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题