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