在Python中引用成员函数(在同一模块中)时,是否应该使用self
?
更一般地说,我想知道什么时候需要使用self
,不仅是方法,还有变量。
答案 0 :(得分:29)
添加答案,因为Oskarbi不明确。
在以下情况下使用self
:
时
self
,则将instance = MyClass()
称为MyClass.my_method
而不是instance.my_method(some_var)
。这些不应该只是不使用自我的例子。当你 使用它时,dos就会出现。
答案 1 :(得分: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...
答案 2 :(得分:4)
nothing ' special'关于名称self
。它是Pythonistas惯例的首选名称,用于指示该参数应包含的内容。
Python运行时将传递一个' self'在实例上调用实例方法时的值,无论您是否故意提供它。这通常会导致容易诊断/理解错误(因为函数将使用错误数量的参数调用),但使用*args
会导致更奇怪的类型错误。
当您在实例上调用实例方法时,将隐式传递参数。它包含您调用方法的实例。所以你不要在函数调用中提到self
,因为(a)如上所述,这没有任何意义(范围内没有self
,一般而言,self
不是关键字或特殊名称或任何东西); (b)您已经指明要使用的实例(通过撰写my_instance.
)。
当然,您可以通过从类中访问它来显式调用实例方法。在这种情况下,您需要明确地将实例作为第一个参数传递。一般来说,你不想这样做。并且你特别不想编写代码,这些代码考虑了第一个参数是以这种方式显式传递的其他参数的可能性。这类似于在C ++中检查if (this == null)
:您不会这样做,因为如果它可能意味着什么,那么调用代码错误 ,在道德上,如果不合法。 (至少在Python中你不会遇到未定义行为的问题,但它在道德上仍然存在错误。)
在实例方法中,由于self
是已将实例指定为值的参数,因此可以编写self.whatever
来访问实例的属性。与其他一些隐含的this
'不同。样式语言,属性名称不隐式"范围"。
self
没有其他用例,因为它不是一个特殊的名称,这是命名约定所针对的一个特定目的。如果您需要访问变量' (实际上是一个属性)来自另一个模块,您将使用模块名称。如果您想从当前模块访问一个模块,则不需要前缀,或者真的可能。 (嗯,可以在dict
返回的globals()
中明确查找,但请不要这样做。)
答案 3 :(得分:3)
例如变量和方法,必须随时使用self。