【问题标题】:state retention for classes and closures类和闭包的状态保留
【发布时间】:2015-06-16 16:22:01
【问题描述】:

来源:mark lutz 学习 python

内容区域:第 #503 页

类与闭包: 它指出“类在状态保留方面可能看起来更好,因为它们通过属性分配使它们的记忆更加明确。

当保持状态是唯一目标时,闭包函数通常提供了一种更轻量且可行的替代方案。它们为单个嵌套函数所需的数据提供每次调用的本地化存储。

状态保留是什么意思,它如何通过属性分配使记忆更加明确?

谁能提供一个例子,证明在保留状态的情况下闭包更轻量级,并解释在单个嵌套函数的上下文中每个本地化的数据存储意味着什么?

【问题讨论】:

    标签: python closures


    【解决方案1】:

    这是一个简单的闭包:

    def make_counter(start=0):
        count = start - 1
        def counter():
            nonlocal count  # requires 3.x
            count += 1
            return count
        return counter
    

    你这样称呼它:

    >>> counter = make_counter()
    >>> counter()
    0
    >>> counter()
    1
    >>> # and so on...
    

    如您所见,它会跟踪它被调用的次数。该信息称为“状态”。它是“每次调用本地化状态”,因为您可以一次创建多个计数器,并且它们不会相互干扰。在这种情况下,状态被隐式保留(几乎),基于闭包在其封闭范围内保持对count 变量的引用。另一方面,类会更明确:

    class Counter:
        def __init__(self, start=0):
            self.count = start - 1
        def __call__(self):
            self.count += 1
            return self.count
    

    这里,状态被显式附加到对象上。

    【讨论】:

    • 我在交互式 shell 中尝试了闭包示例,它运行良好,但是当我尝试 counter() 时,我得到 Typeerror:'NoneType' object is not callable。另外你为什么提到非本地的计数..我们是否为范围变量实施 LEGB 规则?
    • @Praneeth:我修复了 NoneType 的问题。如果我们不使用nonlocal,该示例将是非法的,因为它会尝试增加一个尚不存在的局部变量。
    • 它现在可以工作了..总结通过类表达看起来比闭包在行数方面更直接,这意味着我们在缓存中为类保存了比闭包函数更多的数据!?
    • 我们也可以像交互式shell中的闭包一样调用类示例吗?
    • @Praneeth:除非您遇到性能问题,否则您不应该担心这样的细节。如果您遇到此类问题,您应该对这两种方法进行基准测试,看看哪种方法更好。
    猜你喜欢
    • 2021-08-07
    • 2013-05-11
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多