类和闭包的状态保留

Pra*_*eth 3 python closures

资料来源:马克·卢兹(Mark Lutz)学习Python

内容区域:第503页

类与闭包:它指出“类在状态保留方面似乎更好,因为它们通过属性分配使它们的内存更加明确。

当保留状态是唯一的目标时,关闭函数通常会提供更轻巧和可行的选择。它们为单个嵌套函数所需的数据提供按呼叫的本地存储。

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

谁能提供一个示例,证明在保留状态的情况下关闭更轻巧,并解释在单个嵌套函数的上下文中数据的每个局部存储意味着什么?

Kev*_*vin 5

这是一个简单的关闭:

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

您这样称呼它:

>>> counter = make_counter()
>>> counter()
0
>>> counter()
1
>>> # and so on...
Run Code Online (Sandbox Code Playgroud)

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

class Counter:
    def __init__(self, start=0):
        self.count = start - 1
    def __call__(self):
        self.count += 1
        return self.count
Run Code Online (Sandbox Code Playgroud)

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