为什么在执行函数后实例变量没有丢失?

时间:2013-11-29 08:41:14

标签: python variables singleton

通常情况下,我希望在执行该函数后会丢失一个函数变量。在下面的例子中,我在一些教程之后写了一个Singleton,但是它可以工作。有人可能会说,每次调用instances函数时,singleton都应该为空。

def singleton(cls):
    instances = {}
    def get_instance(*args, **kwargs):
        if cls not in instances:
            instances[cls] = cls(*args, **kwargs)
        return instances[cls]
    return get_instance

@singleton
class cls(object):
    pass

我的假设是,如果不返回动态函数instances,其中存储了对变量的引用以使其仍然可用,那么get_instance确实会丢失。这导致instances继续存在。

这种解释是否正确?对于每个get_instance来说,instances还有一个单独的“实例”,这也是正确的吗?它们不能与每个singleton来电相同,而是有新的instances = {}

1 个答案:

答案 0 :(得分:1)

此:

>>> @singleton
>>> class cls(object):
...    pass

等同于:

>>> class cls(object):
...    pass
>>> cls = singleton( cls )

singleton每个类只运行一次(不是每次实例化)。每次实例化时,返回的函数(每次调用get_instance时都是singleton的不同实例)运行一次。因此,即使您尝试实例化许多instances个对象,也只会创建一个cls对象。

注意在上述之后实际上是什么类型的可调用cls

>>> cls
<function get_instance at 0x0000000002352B38>

由于Python使用garbage collection,因此不再回收instances个对象,直到它们不再可用。只要能够访问get_instance的函数{{1}},就可以认为它是可达的。