pythonself:我必须将self传递到函数中才能引用self吗?

pythonself:我必须将self传递到函数中才能引用self吗?,python,Python,这个问题令人困惑。这里有一个例子 class some_class(): some_var = 5 def some_fun(self): def another_fun(): return self.some_var 这没关系吧?我不必有:另一个叫做self的乐趣(self)? 事实上,我已经测试过了,而且效果很好。我只是想澄清一下,因为这让我有点不确定 是的,当您在另一个函数中定义一个函数时,内部函数可以从外部函数读取变量。这不是特定于self的。它适用

这个问题令人困惑。这里有一个例子

class some_class():
  some_var = 5
  def some_fun(self):
     def another_fun():
         return self.some_var
这没关系吧?我不必有:另一个叫做self的乐趣(self)?
事实上,我已经测试过了,而且效果很好。我只是想澄清一下,因为这让我有点不确定

是的,当您在另一个函数中定义一个函数时,内部函数可以从外部函数读取变量。这不是特定于
self
的。它适用于所有函数中的所有变量:

>>> def outer():
...     a = 2
...     def inner():
...         print a
...     inner()
>>> outer()
2
在Python2中,不能在内部函数中重新绑定外部变量(即,不能在上面的
internal
内部
internal
中执行
a=3
)。在Python3中,可以使用
非本地
语句来实现这一点


然而,你为什么要这样做?首先,您上面的代码甚至都不会给
带来另一种乐趣,因此它所做的并不重要。一般来说,在其他函数中定义函数有点奇怪。当然,这样做是有正当理由的(例如,装饰者),但在许多情况下,这可能会引起混淆。

在您的情况下,这是不需要的,因为
另一个\u fun
嵌套在其他函数中,因此它捕获该函数的本地名称,其中包括
self
。实际上,可以从
某个乐趣
访问的任何名称也可以从
另一个乐趣
访问

这就是所谓的闭包,编写创建函数的函数非常棒。经典的例子是:

def MultiplyBy(x):
    def M(y):
        return x * y
    return M

Double = MultiplyBy(2)
Triple = MultiplyBy(3)

print Double(10), Triple(10)

这将打印
20 30

实际上,装饰师是合法的,会引起混乱。@rodrigo:我没有说这两种情况是相互排斥的:-)这样做没有特别的原因,只是在更改某些代码时碰巧做了。谢谢你的回复