0

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

class some_class():
  some_var = 5
  def some_fun(self):
     def another_fun():
         return self.some_var

这没问题吧?我不必: another_fun(self) 调用self?我实际上测试了它并且它有效。我只是想澄清一下,因为这让我有点不确定。

4

2 回答 2

5

在您的情况下,它是不需要的,因为another_fun它嵌套在其他函数中,因此它从该函数中捕获本地名称,其中包括self. 实际上,任何可访问的名称都可以从some_fun访问another_fun

这就是一些人所说的闭包,编写创建函数的函数很棒。经典的例子是:

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

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

print Double(10), Triple(10)

那将打印20 30.

于 2012-11-22T00:16:35.237 回答
2

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

>>> def outer():
...     a = 2
...     def inner():
...         print a
...     inner()
>>> outer()
2

在 Python 2 中,您不能在内部函数中重新绑定外部变量(即,您不能a = 3inner上面执行操作)。在 Python 3 中,您可以使用nonlocal语句执行此操作。

然而,你为什么要这样做?首先,您上面的代码甚至没有调用another_fun,所以它的作用无关紧要。一般来说,在其他函数中定义函数有点奇怪。这样做肯定有合法的案例(例如,装饰器),但在许多情况下,它可能会引起混淆。

于 2012-11-22T00:16:21.487 回答