通常情况下,我希望在执行该函数后会丢失一个函数变量。在下面的例子中,我在一些教程之后写了一个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 = {}
。
答案 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}},就可以认为它是可达的。