Ver Mensaje Individual
  #4 (permalink)  
Antiguo 17/06/2009, 09:35
Avatar de razpeitia
razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Patrón singleton para acceso a base de datos

Código python:
Ver original
  1. class GestorBD(object):
  2.     instance=None
  3.     i = 0
  4.     def __new__(cls, *args, **kargs):
  5.         if cls.instance is None:
  6.             cls.instance=object.__new__(cls, *args, **kargs)          
  7.         return cls.instance
  8.  
  9.     def __init__(self):
  10.         self.i += 1
  11.         print "Me he ejecutado", self.i, "veces"
  12.  
  13. singleton1 = GestorBD()
  14. singleton2 = GestorBD()
  15. print singleton1.i
  16. print singleton2.i

Inicia una nueva conexión, pero esta sigue siendo única. En pocas palabras diaria que actualiza la conexión.

Puedes verlo en el ejemplo anterior, cada vez que creas un objeto este primero llama a __new__ y luego a __init__. Pero con cada llamada a __init__ redefines el objeto.

Una solucion prodria ser, ponerlo de la siguiente manera:
Código python:
Ver original
  1. class GestorBD(object):
  2.     instance=None
  3.     conexion=psycopg.connect("host='xxx.xxx.xxx.xxx' port= 'xxx' dbname='xx' user= 'xx' password= 'xx'")
  4.  
  5.     def __new__(cls, *args, **kargs):
  6.         if cls.instance is None:
  7.             cls.instance=object.__new__(cls, *args, **kargs)          
  8.         return cls.instance
  9.  
  10.     def execute(self, consulta):
  11.         self.cursor=self.conexion.cursor()
  12.         self.cursor.execute(consulta)        
  13.         registros=self.cursor.fetchall()
  14.         return registros