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 に答える