2012-06-21 15 views
1

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

更完整['@ singleton'](http://wiki.python.org/moin/PythonDecoratorLibrary#Singleton)。 – ephemient

+0

@ephemient謝謝。一般而言,這是一個非常有用的外觀頁面。 – tacaswell

回答

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