When do you use 'self' in Python?
在(同一个模块内)引用Python中的成员函数时,是否应该使用self?
更一般地说,我想知道什么时候需要使用self,不仅用于方法,也用于变量。
添加一个答案,因为oskarbi不明确。
您在以下情况下使用self:
定义实例方法。当您对实例调用方法时,它会自动作为第一个参数传递,并且它是调用该方法的实例。
从实例方法内部引用类或实例属性。使用它可以从方法内部调用方法或访问方法调用的实例的名称(变量)。
你不使用self当
通常调用实例方法。使用oskarbi的例子,如果你使用instance = MyClass(),你称MyClass.my_method为instance.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... |
- 那么"class myclass(object)"是一个构造函数吗?我看到"object"是一个参数,但不确定这意味着什么…
- @类定义中的darktemplar参数是基类(还有一个关键字参数,metaclass,用于在python 3中设置类的类型)
- 这不是构造函数,而是类定义。正如@agf所说,object只是一个基本类。当您实例化类时,不必传递任何参数(除非您指定了一个带有更多参数的__init__(self)方法)。
这个名字没有什么特别之处。它是pythonistas约定的首选名称,用于指示该参数应该包含什么。
当您对一个实例调用一个实例方法时,python运行时将传递一个"self"值,不管您是否有意提供它。这通常会导致容易诊断/理解的错误(因为调用函数时参数的数目不正确),但是使用*args会导致更奇怪的类型错误。
当对实例调用实例方法时,将隐式传递参数。它包含调用方法的实例。所以在函数调用中没有提到self,因为(a)如上所述,这没有任何意义(一般来说,作用域中没有self,self不是关键字或特殊名称或任何东西);(b)您已经指示了要使用的实例(通过写入my_instance.)。
当然,您可以通过从类中访问实例方法来显式调用它。在这种情况下,需要将实例显式地作为第一个参数传递。一般来说,你不想这样做。您尤其不希望编写代码来考虑第一个参数可能是以这种方式显式传递的其他参数。这类似于在C++中检查EDCOX1的14位:你不这样做,因为如果它可能意味着什么,那么调用代码是错误的,道德上的,如果不是合法的。(至少在Python中,您不会遇到未定义行为的问题,但在道德上仍然是错误的。)
在instance方法中,由于self是一个参数,已经将该实例指定为一个值,所以可以编写self.whatever来访问该实例的属性。与其他一些"隐式EDOCX1"(17)样式的语言不同,属性名不是隐式的"在范围内"。
对于self没有其他的用例,因为它又不是一个特殊的名称,这是命名约定解决的一个特定目的。如果需要从另一个模块访问"变量"(实际上是一个属性),您将使用模块名。如果您想从当前模块访问一个,那么就不需要前缀,也不可能做到这一点。(好吧,你可以在globals()返回的dict中明确查找,但请不要这样做。)
例如,变量和方法必须随时使用self。
- 所以当有疑问的时候,一定要坚持下去?
- 对!这是必须的。
- @在定义实例方法、调用实例方法或从实例方法内部引用实例变量时,DarkTemplar始终使用self,而不是使用self。我不知道他"随时随地"想说什么,但事实并非如此。
- 这正是我所说的任何时候。任何时候你可以在Java中使用这个,你必须在Python中使用Soad。@AFG感谢您的精确计算。
- 好吧,除了self不是python关键字,而且如果您不介意违反约定和烦扰任何阅读代码的人,您可以调用传递给绑定实例方法的第一个参数。
- 你说得对。从正式的pydoc:通常,方法的第一个参数称为self。这只不过是一个约定:self这个名字对python来说绝对没有特殊意义。但是,请注意,如果不遵循约定,您的代码对其他Python程序员的可读性可能会降低,而且还可以想象,可能会编写依赖此类约定的类浏览器程序。在docs.python.org/tutorial/classes.html