何时在Python中使用'self'?

38 投票
4 回答
65573 浏览
提问于 2025-04-17 04:04

在Python中,当你在同一个模块里引用一个成员函数时,是否应该使用self

更广泛地说,我想知道什么时候必须使用self,不仅仅是针对方法,还有变量也是如此。

4 个回答

6
  1. 名字 self 并没有什么特别的地方。它只是 Python 程序员习惯用来表示这个参数应该包含什么内容的名字。

  2. 当你在一个实例上调用实例方法时,Python 运行时会自动传递一个 'self' 值给你,无论你是否特意提供这个参数。这通常会导致一个容易理解的错误(因为函数会收到错误数量的参数),但如果使用 *args,可能会出现更奇怪的类型错误。

  3. 当你在一个实例上调用实例方法时,这个参数是隐式传递的。它包含了你调用方法的那个实例。所以在函数调用时你不需要提到 self,因为(a)如上所述,这样做没有意义(一般情况下没有 self 这个东西在作用域内,而且 self 不是关键字或特殊名称);(b)你已经通过写 my_instance. 指定了要使用的实例。

  4. 当然,你可以通过从类中访问来显式调用实例方法。在这种情况下,你需要将实例作为第一个参数显式传递。一般来说,你不想这样做。尤其是你不想写代码去考虑第一个参数可能是以这种方式显式传递的其他东西。这就像在 C++ 中检查 if (this == null):你不应该这样做,因为如果它可能意味着任何东西,那么调用代码就是错误的,虽然不一定是法律上的错误。(至少在 Python 中你不会遇到未定义行为的问题,但这仍然是道德上的错误。)

  5. 在实例方法内部,由于 self 是一个被赋值为实例的参数,你可以写 self.whatever 来访问实例的属性。与某些其他“隐式 this”风格的语言不同,属性名称并不是隐式“在作用域内”。

  6. 没有其他使用 self 的情况,因为它并不是一个特殊的名字,而这个命名约定正是为了解决这个特定的目的。如果你需要从另一个模块访问一个“变量”(实际上是一个属性),你会使用模块名。如果你想从当前模块访问一个,就不需要前缀,或者说实际上也不可能。(好吧,你可以globals() 返回的 dict 中显式查找,但请不要这样做。)

18

在其他实例方法中,用 self 来引用实例变量和方法。同时,在定义实例方法时,把 self 放在第一个参数的位置。

举个例子:

class MyClass(object):

    my_var = None

    def my_method(self, my_var):
         self.my_var = my_var
         self.my_other_method()

    def my_other_method(self):
         # do something...
51

我来补充一个答案,因为Oskarbi的解释不够清楚。

你在以下情况下会用到 self

  1. 定义一个实例方法时。当你在一个实例上调用方法时,self会自动作为第一个参数传入,它代表你调用方法的那个实例。
  2. 在实例方法内部引用类或实例的属性时。如果你想在这个方法里调用某个方法或者访问这个实例上的某个变量,就要用到 self

应该在以下情况下使用 self

  1. 正常调用实例方法时。举个例子,如果你写 instance = MyClass(),然后调用 MyClass.my_method 时,你应该写成 instance.my_method(some_var),而不是 instance.my_method(self, some_var)
  2. 在类定义内部,但在实例方法外部引用类属性时。
  3. 静态方法 内部时。

这些不该用 self 的情况只是一些例子,而应该用 self 的情况就是你需要用它的时候。

撰写回答