Python schließen lokale Variablen

In dieser Antwort wird ein Singleton-Dekorator als solcher demonstriert

def singleton(cls): instances = {} def getinstance(): print len(instances) if cls not in instances: instances[cls] = cls() return instances[cls] return getinstance 

Aber instances ist "lokal" zu jeder Klasse, die verziert ist, also habe ich versucht, effizienter zu sein und zu benutzen

 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' 

Dies ergibt jedoch einen Fehler

 UnboundLocalError: local variable 'instances' referenced before assignment 

Wenn m = MyTest() aufgerufen wird

Ich glaube ich verstehe, was das nicht funktionieren sollte (da die Zuordnung zu Instanzen lokal ist und zwischen Anrufen verloren geht), aber ich verstehe nicht, warum ich diesen Fehler bekomme.

One Solution collect form web for “Python schließen lokale Variablen”

Der Grund für den Fehler ist Python ist klüger als ich bin und identifiziert, dass Instanzen wird lokal durch die Zuweisung gemacht und geht nicht auf Reichweite, um die Aufgabe zu finden. Das folgende funktioniert, aber auf Kosten des Hinzufügens einer neuen Klasse.

 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 
  • Google App Engine Singletons (Python)
  • Python: Argumentbasiertes Singleton
  • Python3 Singleton Metaclass Methode funktioniert nicht
  • Python: Denken an ein Modul und seine Variablen als Singleton - Clean Ansatz?
  • Wann soll ich ein Singleton in Python verwenden?
  • Warum ist das Borg-Muster besser als das Singleton-Muster in Python
  • Singleton über Module
  • Python: @staticmethod mit @property
  • Warum funktioniert ein Python-Modul wie ein Singleton?
  • Python Singleton, nimm 2
  • Gibt es einen Weg, um Unterklassen on-the-fly zu schaffen?
  • Python ist die beste Programmiersprache der Welt.