问题很混乱。这是一个例子。Python自我:我必须将自我传递给函数来引用自我吗?
class some_class():
some_var = 5
def some_fun(self):
def another_fun():
return self.some_var
这是对的吗?我不必有:another_fun(self)自称? 我真的测试过它,它工作。我只是想澄清一下,因为这让我有些不确定。
问题很混乱。这是一个例子。Python自我:我必须将自我传递给函数来引用自我吗?
class some_class():
some_var = 5
def some_fun(self):
def another_fun():
return self.some_var
这是对的吗?我不必有:another_fun(self)自称? 我真的测试过它,它工作。我只是想澄清一下,因为这让我有些不确定。
在你的情况下,它是不需要的,因为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
。
是的,当你在另一个函数中定义一个函数时,内部函数可以从外部函数读取变量。这不是特定于self
。它适用于在所有功能的全部变量:
>>> def outer():
... a = 2
... def inner():
... print a
... inner()
>>> outer()
2
在Python 2,则不能重新绑定外变量在内部函数(即,可以不做a = 3
上述内部inner
)。在Python 3中,您可以使用nonlocal
声明来执行此操作。
但是,你为什么要这样做?首先,上面的代码甚至不会调用another_fun
,所以它所做的并不重要。一般来说,在其他函数中定义函数有点奇怪。这样做肯定有合法的情况(例如装饰者),但在很多情况下,这可能会造成混淆。
谢谢,现在我知道什么是闭包 – dtc