【发布时间】:2018-10-14 05:48:36
【问题描述】:
我知道高阶函数和由函数返回创建的闭包。在大多数情况下,我发现它很有用并重复使用它。我的问题与使用类定义创建的闭包和引用从函数调用返回的类实例的函数有关。这可以归类为常规闭包还是 Python(或编程)文献中的其他内容?这是一个例子:
class Klass:
def __init__(self, val):
self.val = val
def ret_val(self):
return self.val
def gen_val_fn(val):
inst = Klass(val)
return inst.ret_val
fn5 = gen_val_fn(5)
fn6 = gen_val_fn(6)
print("first: {}".format(fn5()))
print("second: {}".format(fn6()))
内部是如何工作的?我的假设是在gen_val_fn(5) 调用之后,创建了Klass 的第一个实例,并且在fn5 被垃圾收集之前它不会被垃圾收集。所以它能够创建val=5 作为闭包(我不确定这是否是正确的术语)。是否有任何文件或内部知识可以指出这一点?或者如果这个解释有缺陷就解释一下。
谢谢!
【问题讨论】:
-
这里没有闭包。
val只是一个属性。 -
闭包仅适用于在其他函数中定义的函数。您所指的只是一个实例属性。
-
@Daniel:fn5 肯定引用了绑定方法 inst.ret_val。
-
找到你的问题真是太棒了,我最近发现这个类只是一个闭包的替代品。
-
@alexHall 闭包是gen_val_fn,封闭变量是inst。
标签: python python-3.x function class closures