我知道使用函数返回创建的高阶函数和闭包。在大多数情况下,我发现它很有用并且重复使用它。我的问题与使用类定义创建的闭包有关,并引用了从函数调用返回的类实例函数。这可以归类为常规闭包,还是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
作为闭包(我不确定这可能是正确的术语)。是否有任何文件或内部知识可以指出这一点?或者解释一下这个解释是否存在缺陷。
谢谢!
答案 0 :(得分:2)
这称为绑定方法。
绑定方法保存对实例(即self
)和函数的引用,因此在调用它时,self
将插入到参数列表中。
当然,self
包含对所有其他成员变量的引用。
在您的示例中,请尝试以下操作:
>>> fn5
<bound method Klass.ret_val of <__main__.Klass object at 0x006B1270>>
>>> fn5.__self__
<__main__.Klass object at 0x006B1270>
>>> fn5.__self__.val
5
然后,调用fn5()
与调用fn5.__func__(fn5.__self__)
相同。