Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python类闭包:它叫什么?_Python_Python 3.x_Function_Class_Closures - Fatal编程技术网

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

我知道高阶函数和用函数返回创建的闭包。在大多数情况下,我发现它很有用,并反复使用。这里我的问题与使用类定义创建的闭包有关,该闭包引用从函数调用返回的类实例的函数。这可以归类为常规闭包,还是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\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。