Patrón Singleton en Python3
Existen distintas alternativas para implementar este patrón en Python. Una de ellas consiste en el uso de metaclass, que es la que vamos a ver a continuación. Para ello, es necesario definirnos un nuevo tipo:
class SingletonMetaClass(type):
def __init__(cls,name,bases,dic):
super(SingletonMetaClass, cls).__init__(name, bases, dic)
cls._singleton_instance = None
def __call__(cls,*args,**kw):
if cls._singleton_instance is None:
cls._singleton_instance = \
super(SingletonMetaClass, cls).__call__(*args, **kw)
return cls._singleton_instance
Así, nuestra clase SingletonMetaClass será un nuevo tipo, hereda de type, por lo que podemos utilizarlo para la construcción de nuestras clases, como por ejemplo:
class Singleton(metaclass=SingletonMetaClass): pass
Así, la construcción de objetos del tipo Singleton están controlados por SingletonMetaClass. A partir de este punto, todas aquellas clases que tengamos interés en que sigan este patrón heredarán de la clase Singleton.
Veamos un ejemplo:
>>> class ExampleNoSingleton(): pass
...
>>> ExampleNoSingleton()
<__main__.ExampleNoSingleton object at 0x7fec6bf2f110>
>>> ExampleNoSingleton()
<__main__.ExampleNoSingleton object at 0x7fec6bf2f1d0>
>>> ExampleNoSingleton()
<__main__.ExampleNoSingleton object at 0x7fec6bf2f110>
>>>
>>> class ExampleSingleton(Singleton): pass
...
>>> ExampleSingleton()
<__main__.ExampleSingleton object at 0x7fec6bf2f210>
>>> ExampleSingleton()
<__main__.ExampleSingleton object at 0x7fec6bf2f210>
>>> ExampleSingleton()
<__main__.ExampleSingleton object at 0x7fec6bf2f210>
>>>
Tags
La teoría es cuando crees saber algo, pero no funciona.
La práctica es cuando algo funciona, pero no sabes por qué.
Los programadores combinan la teoría y la práctica:
Nada funciona y no saben por qué.
