agf*_*agf 31
添加答案因为Oskarbi不明确.
您使用self时:
你不使用self的时候
instance = MyClass(),你打电话MyClass.my_method的instance.my_method(some_var)不是instance.my_method(self, some_var).这些不应该只是不使用自我的例子.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)
这个名字没有什么self“特别”之处。这是 Pythonistas 惯用的名称,用于指示该参数预期包含的内容。
当您在实例上调用实例方法时,Python 运行时将传递一个“self”值,无论您是否有意提供它。这通常会导致易于诊断/理解的错误(因为该函数将使用错误数量的参数来调用),但使用*args可能会导致更奇怪的类型错误。
当您在实例上调用实例方法时,该参数会隐式传递。它包含您调用该方法的实例。因此,您不会self在函数调用中提及,因为 (a) 如上所述,这没有任何意义(self一般来说,范围内没有 a,也不self是关键字或特殊名称或任何内容);(b) 您已经指定要使用的实例(通过编写my_instance.)。
当然,您可以通过从类访问实例方法来显式调用它。在这种情况下,您需要将实例作为第一个参数显式传递。一般来说,您不想这样做。而且您尤其不想编写考虑第一个参数是通过这种方式显式传递的其他参数的可能性的代码。这类似于if (this == null)在 C++ 中进行检查:你不这样做,因为如果它可能意味着什么,那么调用代码就是错误的,从道德上讲,如果不合法的话。(至少在 Python 中你不会遇到未定义行为的问题,但这在道德上仍然是错误的。)
在实例方法中,由于self是已将实例分配为值的参数,因此您可以写入self.whatever访问实例的属性。与其他一些“隐式this”风格语言不同,属性名称并不隐式“在范围内”。
没有其他用例self,因为它也不是一个特殊的名称,并且这是命名约定所解决的一个特定目的。如果您需要从另一个模块访问“变量”(实际上是一个属性),您可以使用模块名称。如果您想从当前模块访问其中一个,则不需要前缀,或者实际上是可能的。(好吧,您可以dict在返回的中明确查找它globals(),但请不要这样做。)
| 归档时间: |
|
| 查看次数: |
38143 次 |
| 最近记录: |