Python类闭包:它叫什么?
我知道高阶函数和用函数返回创建的闭包。在大多数情况下,我发现它很有用,并反复使用。这里我的问题与使用类定义创建的闭包有关,该闭包引用从函数调用返回的类实例的函数。这可以归类为常规闭包,还是Python(或编程)文献中的其他内容?以下是一个例子:Python类闭包:它叫什么?,python,python-3.x,function,class,closures,Python,Python 3.x,Function,Class,Closures,我知道高阶函数和用函数返回创建的闭包。在大多数情况下,我发现它很有用,并反复使用。这里我的问题与使用类定义创建的闭包有关,该闭包引用从函数调用返回的类实例的函数。这可以归类为常规闭包,还是Python(或编程)文献中的其他内容?以下是一个例子: class Klass: def __init__(self, val): self.val = val def ret_val(self): return self.val def gen_val_f
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\u val\u fn(5)
调用之后,创建了Klass的第一个实例,在fn5
被垃圾收集之前,它不会被垃圾收集。因此,它能够创建val=5
作为闭包(我不确定这是否是正确的术语)。是否有任何文件或内部知识,你可以指出这一点?或者,如果这个解释有缺陷,就解释一下
谢谢 这称为绑定方法 绑定方法保存对实例(即
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.\u self__
>>>fn5.自我价值
5.
然后,调用
fn5()
与调用fn5是一样的val
只是一个属性。闭包仅适用于在其他函数中定义的函数。您所指的只是一个实例属性。@Daniel:fn5肯定引用了绑定方法inst.ret_val。发现您的问题真是太神奇了,我最近发现类只是闭包的一种替代方法。@alexHall闭包是gen_val_fn,封闭的变量是inst。