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