你什么时候在Python中使用'self'?

Dar*_*lar 29 python self

你是否应该self在Python中引用成员函数时使用(在同一模块中)?

更一般地说,我想知道什么时候需要使用self,不仅仅是方法,还有变量.

agf*_*agf 31

添加答案因为Oskarbi不明确.

您使用self时:

  1. 定义实例方法.当您在实例上调用方法时,它会自动作为第一个参数传递,并且它是调用该方法的实例.
  2. 从实例方法内部引用类或实例属性.使用它想要调用方法或从该方法内部访问调用该方法的实例上的名称(变量).

使用self的时候

  1. 您可以正常调用实例方法.使用Oskarbi的例子,如果你这样做instance = MyClass(),你打电话MyClass.my_methodinstance.my_method(some_var)不是instance.my_method(self, some_var).
  2. 您可以从实例方法外部引用类属性,但在类定义中引用.
  3. 你是一个静态的方法.

这些不应该只是不使用自我的例子.dos就是你应该使用它的时候.


Osk*_*rbi 14

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...
Run Code Online (Sandbox Code Playgroud)

  • 那不是构造函数,而是类定义。正如@agf所说,“object”只是基类。当您实例化该类时,您不必传递任何参数(除非您指定了带有更多参数的 __init__(self)` 方法)。 (2认同)

Kar*_*tel 6

  1. 这个名字没有什么self“特别”之处。这是 Pythonistas 惯用的名称,用于指示该参数预期包含的内容。

  2. 当您在实例上调用实例方法时,Python 运行时将传递一个“self”值,无论您是否有意提供它。这通常会导致易于诊断/理解的错误(因为该函数将使用错误数量的参数来调用),但使用*args可能会导致更奇怪的类型错误。

  3. 当您在实例上调用实例方法时,该参数会隐式传递。它包含您调用该方法的实例。因此,您不会self在函数调用中提及,因为 (a) 如上所述,这没有任何意义(self一般来说,范围内没有 a,也不self是关键字或特殊名称或任何内容);(b) 您已经指定要使用的实例(通过编写my_instance.)。

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

  5. 在实例方法中,由于self是已将实例分配为值的参数,因此您可以写入self.whatever访问实例的属性。与其他一些“隐式this”风格语言不同,属性名称并不式“在范围内”。

  6. 没有其他用例self,因为它也不是一个特殊的名称,并且这是命名约定所解决的一个特定目的。如果您需要从另一个模块访问“变量”(实际上是一个属性),您可以使用模块名称。如果您想从当前模块访问其中一个,则不需要前缀,或者实际上是可能的。(好吧,您可以dict在返回的中明确查找它globals(),但请不要这样做。)