问题令人困惑。这是一个例子。
class some_class():
some_var = 5
def some_fun(self):
def another_fun():
return self.some_var
这没关系吗?我没有:another_fun(self)给自己打电话? 我实际测试了它,它的工作原理。我只想澄清一些,因为它让我有点不确定。
答案 0 :(得分: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
。
答案 1 :(得分:2)
是的,当你在另一个函数中定义一个函数时,内部函数可以从外部函数中读取变量。这与self
无关。它适用于所有函数中的所有变量:
>>> def outer():
... a = 2
... def inner():
... print a
... inner()
>>> outer()
2
在Python 2中,你不能在内部函数中重新绑定外部变量(即,你不能在a = 3
里面inner
执行。在Python 3中,您可以使用nonlocal
语句执行此操作。
但是,你为什么要这样做?首先,上面的代码甚至不会调用another_fun
,因此它的作用并不重要。一般来说,在其他函数中定义函数有点奇怪。这样做肯定是合法的(例如,装饰者),但在许多情况下,它可能会引起混淆。