python闭包局部变量

时间:2012-06-21 16:53:18

标签: python singleton closures

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

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

1 个答案:

答案 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