2

在这个答案中,一个单例装饰器被证明是这样的

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()调用

我想我知道这不应该起作用(因为对实例的分配将是本地的并且在调用之间会丢失),但我不明白为什么我会收到这个错误。

4

1 回答 1

1

错误的原因是 python 比我更聪明,并且确定实例是由赋值本地化的,并且不会在范围内找到赋值。正如@GeeTransit 在评论中指出的那样,这在 python3 中是可能的nonlocal

def nonlocal_singleton(cls):
    instances = None
    def getinstance():
        nonlocal instances
        if instances is None:
            instances = cls()
        return instances
    return getinstance

@nonlocal_singleton
class MyTest(object):
    def __init__(self):
        print('test')
于 2012-06-21T16:53:18.760 回答