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

When do you use 'self' in Python?

在(同一个模块内)引用Python中的成员函数时,是否应该使用self

更一般地说,我想知道什么时候需要使用self,不仅用于方法,也用于变量。


添加一个答案,因为oskarbi不明确。

您在以下情况下使用self

  • 定义实例方法。当您对实例调用方法时,它会自动作为第一个参数传递,并且它是调用该方法的实例。
  • 从实例方法内部引用类或实例属性。使用它可以从方法内部调用方法或访问方法调用的实例的名称(变量)。
  • 你不使用self

  • 通常调用实例方法。使用oskarbi的例子,如果你使用instance = MyClass(),你称MyClass.my_methodinstance.my_method(some_var),而不是instance.my_method(self, some_var)
  • 从实例方法外部但在类定义内部引用类属性。
  • 你在一个静态方法里面。
  • 这些不只是不使用自我的例子。DOS是您应该使用它的时候。


    使用self引用其他实例方法中的实例变量和方法。还将self作为实例方法定义中的第一个参数。

    一个例子:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    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...


  • 这个名字没有什么特别之处。它是pythonistas约定的首选名称,用于指示该参数应该包含什么。

  • 当您对一个实例调用一个实例方法时,python运行时将传递一个"self"值,不管您是否有意提供它。这通常会导致容易诊断/理解的错误(因为调用函数时参数的数目不正确),但是使用*args会导致更奇怪的类型错误。

  • 当对实例调用实例方法时,将隐式传递参数。它包含调用方法的实例。所以在函数调用中没有提到self,因为(a)如上所述,这没有任何意义(一般来说,作用域中没有selfself不是关键字或特殊名称或任何东西);(b)您已经指示了要使用的实例(通过写入my_instance.)。

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

  • 在instance方法中,由于self是一个参数,已经将该实例指定为一个值,所以可以编写self.whatever来访问该实例的属性。与其他一些"隐式EDOCX1"(17)样式的语言不同,属性名不是隐式的"在范围内"。

  • 对于self没有其他的用例,因为它又不是一个特殊的名称,这是命名约定解决的一个特定目的。如果需要从另一个模块访问"变量"(实际上是一个属性),您将使用模块名。如果您想从当前模块访问一个,那么就不需要前缀,也不可能做到这一点。(好吧,你可以在globals()返回的dict中明确查找,但请不要这样做。)


  • 例如,变量和方法必须随时使用self。