Python vs Java C C++

Chema Cortes py en ch3m4.org
Jue Mar 18 13:43:35 CET 2004


[Debería cambiar el "asunto", pero no sabría qué poner :-P]

Hernan Foffani escribió:

> ¿Y si al redifinir la clase uno de los atributos existentes
> de la instancia cambia de tipo? ¿como lo resolverias?

Se podría apañar creando "accesores" (sólo posible con __get__ ó 
__getattribute___) o creando "propiedades" (property()).

Pero me temo que se complicaría todo mucho. :-(
Y con las nuevas clases me temo que ya no se pueden hacer tantas 
barbaridades como las "transmutaciones", etc. Mejor olvidarse de intentarlo.

> ¿cómo aplicarías los cambios si debes actualizar mas
> de una clase?

> ¿Es *necesario* para tu servidor de aplicaciones que los
> objetos tengan larga duración?

Desde luego que estaría todo solucionado si con cada petición del 
cliente se crearan de nuevo los objetos. El problema está en el 
rendimiento, ya que esta práctica aumenta considerablemente el tráfico 
de objetos entre cliente y servidor "siempre" (no sólo cuando se 
producen cambios en la definición).

Habría que buscar un compromiso intermedio que sólo actualize los 
objetos cuando sea necesario.

Por ejemplo, para las nuevas clases de python, donde no es posible hacer 
el truco de cambiar los diccionarios de la clase ó "transmutar" un 
objeto en otro (son atributos de sólo lectura), tenemos que recrear los 
objetos según la nueva definición de la clase. Supongamos que tenemos un 
módulo "MyModule" que redefine varias clases y queremos actualizar los 
objetos que tenemos creados con esas clases:


reload(MyModule)

#clases (tipos) que define 'MyModule'
clsDict=dict([(k,v) for k,v in vars(MyModulo).items()
                     if type(v) is type])

#conversión de tipo de los objetos (module scope)
for k,v in vars().items():
   if v.__class__.__name__ in clsDict.keys():
     obj=vars()[k]     #este objeto usa una clase antigüa
     cls=clsDict[v.__class__.__name__]  #clase nueva
     vars()[k]=cls(obj)   #recreamos el objeto con la clase nueva


Como idea sirve (no la he probado), pero supongo que se puede hacer más 
elegante y fiable.

Ya que se ha hablado de webware, el cherrypy también posee un mecanismo 
similar llamado "hotreload" por el que se avisa al servidor para que 
"recargue" las nuevas clases y recree las instancias a partir de ellas. 
Eso sí, hay que tener en cuenta que estamos hablando de un sistema muy 
simple en el que cada clase tiene una y sólo una intancia.




Más información sobre la lista de distribución Python-es