patron singleton
Gabriel Genellina
gagsl-py2 en yahoo.com.ar
Vie Sep 7 03:11:22 CEST 2007
En Thu, 06 Sep 2007 21:56:26 -0300, José Jachuf <jjachuf en gmail.com>
escribi�:
> Hola este código lo encontré en Internet, y me permite implementar el
> patron singleton. Funciona perfecto, pero parece haber sido escrito por
> el mismo diablo. Cómo hace para funcionar?
Para empezar, en Python no es necesario escribir nada especial para
implementar un singleton: simplemente, usa un modulo. Un módulo *ES* un
verdadero singleton de por sí.
Por otro lado, podrias mirar en el Python Cookbook sobre este tema; una
variante es el Borg ("todos somos uno")
> Lo podría usar, de hecho que ya lo estoy usando en una pequeña
> implementación, pero me gustaría entenderlo. Agradecería que alguien se
> animara a explicarlo.
>
>
> class Singleton(type):
> def __init__(cls, name, bases, dct):
> cls.__instance = None
> type.__init__(cls, name, bases, dct)
>
> def __call__(cls, *args, **kw):
> if cls.__instance is None:
> cls.__instance = type.__call__(cls, *args,**kw)
> return cls.__instance
>
> class A:
> __metaclass__ = Singleton
> def __init__(self, nombre = None):
> self.__nombre = nombre
>
> def Saludar(self):
> print "Hola", self.__nombre
>
> def SetNombre(self, nombre):
> self.__nombre = nombre
Singleton es una metaclase; es el tipo de la clase A. (Si no estuviera la
linea __metaclass__ = Singleton, type(A) devolvería `type`, pero ahora
devuelve `Singleton`).
Cuando se define la clase A, se crea la instancia de la metaclase (que
pasa a ser el tipo de A); cuando se crea una instancia de la clase A, se
invoca el __call__ de la metaclase.
Singleton se guarda un atributo privado __instance con la (unica)
instancia de la clase A. Al principio vale None; cuando se pretende crear
una instancia de A, si ya existía, devuelve ésa; sino, crea una (la
única), se la guarda en __instance, y la devuelve.
Es la forma mas rebuscada de escribir un singleton que vi.
--
Gabriel Genellina
------------ próxima parte ------------
_______________________________________________
Python-es mailing list
Python-es en aditel.org
http://listas.aditel.org/listinfo/python-es
Más información sobre la lista de distribución Python-es