Vi muchos métodos para hacer un singleton en Python e intenté usar la implementación de metaclase con Python 3.2 (Windows), pero no parece que devuelva la misma instancia de mi clase de singleton.
class Singleton(type): _instances = {} def __call__(cls, *args, **kwargs): if cls not in cls._instances: cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs) return cls._instances[cls] class MyClass(object): __metaclass__ = Singleton a = MyClass() b = MyClass() print(a is b) # False
Utilizo la implementación de decorator ahora que está funcionando, pero me pregunto qué tiene de malo esta implementación.
La syntax de metaclase ha cambiado en Python3. Ver la documentación .
class MyClass(metaclass=Singleton): pass
Y funciona:
>>> MyClass() is MyClass() True