【问题标题】:Python Class Closure: Is It What It Called?Python 类关闭:它叫什么?
【发布时间】: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


【解决方案1】:

这称为绑定方法。

绑定方法持有对实例(即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__)是一样的。

【讨论】:

    猜你喜欢
    • 2011-09-30
    • 2013-05-05
    • 1970-01-01
    • 2016-12-10
    • 2019-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多