In this answer单例装饰器就是这样展示的
def singleton(cls):
instances = {}
def getinstance():
print len(instances)
if cls not in instances:
instances[cls] = cls()
return instances[cls]
return getinstance
但是instances
对于每个装饰的类都是“本地的”,所以我试图提高效率并使用
def BAD_singleton(cls):
instances = None
def getinstance():
if instances is None:
instances = cls()
return instances
return getinstance
@BAD_singleton
class MyTest(object):
def __init__(self):
print 'test'
然而,这会产生错误
UnboundLocalError: local variable 'instances' referenced before assignment
调用m = MyTest()
时
我想我明白这应该不起作用(因为对实例的赋值将是本地的并且在调用之间丢失),但我不明白为什么我会收到此错误。
答案 0 :(得分:0)
错误的原因是python比我更聪明,并且确定实例是由赋值实现的,并且不会向上查找赋值。以下方法有效,但代价是添加新类。
def SAD_singleton(cls):
class tmp(object):
def __init__(self):
self.c = None
instances = tmp()
def getinstance():
if instances.c is None:
instances.c = cls()
return instances.c
return getinstance