[pyar] Modificación de clases e instancias

Javier Burroni javier.burroni en gmail.com
Mie Ago 31 14:31:16 ART 2016


Pero sigo teniendo el problema: inst1 e inst2 refieren s la clase vieja

On Wednesday, August 31, 2016, Daniel Moisset <dmoisset en machinalis.com>
wrote:

> Yo haria algo del estilo
>
> class Clase:
>     def pirulin(self): print("pirulin")
> inst1 = Clase()
> inst2 = Clase()
> class Clase(Clase): # Notar que aca heredo de la clase vieja
>     def barquillo(self): print("barquillo")
> inst3 = Clase()
> # Aca inst1 e inst2 tienen pirulin pero no barquillo
> # Aca inst3 tienen pirulin y barquillo
>
> Si te jode que se vaya creando una cadena de herencia, capaz haria un
> "redefinir" que me arme clases llamando a type y extendiendo la anterior,
> algo asi (no probe esto):
>
> redefinir(cls, **atributos_y_metodos_nuevos):
>     aym = cls.__dict__.copy()
>     aym.update(atributos_y_metodos_nuevos)
>     nueva_c = type(cls.__name__, cls.__bases__, aym)
>     return nueva_c
>
> ahi podes hacer algo como
>
> def barquillo(self): print("barquillo")
> Clase = redefinir(Clase, barquillo=barquillo)
>
> y tenes una version nueva de la clase extendiendola
>
> Saludos,
>     D.
>
>
> 2016-08-31 17:51 GMT+01:00 Javier Burroni <javier.burroni en gmail.com
> <javascript:_e(%7B%7D,'cvml','javier.burroni en gmail.com');>>:
>
>> exacto. Hay alguna forma de hacer lo que planteaba mas "standard" ?
>>
>> 2016-08-31 12:41 GMT-04:00 Ariel Rossanigo <arielrossanigo en gmail.com
>> <javascript:_e(%7B%7D,'cvml','arielrossanigo en gmail.com');>>:
>>
>>>
>>>
>>> El 31 de agosto de 2016, 13:22, Javier Burroni<javier.burroni en gmail.com
>>> <javascript:_e(%7B%7D,'cvml','javier.burroni en gmail.com');>> escribió:
>>>
>>>>
>>>>
>>>> 2016-08-31 11:59 GMT-04:00 Nats <taku246 en gmail.com
>>>> <javascript:_e(%7B%7D,'cvml','taku246 en gmail.com');>>:
>>>>
>>>>> Javier, las instancias no deberían quedar desactualizadas, digamos que
>>>>> modificada la clase se modifican en cadena todas las instancias; justamente
>>>>> ese es todo el motivo de creación de clases. Sino harias un copy/paste y
>>>>> listo. Estas seguro que no las modifica?
>>>>>
>>>>> Esto es así en python 3? Si es así, es una buena noticia y una linda
>>>> razón para migrar. En python 2 no funciona así
>>>>
>>>
>>> Si no entiendo mal, lo que vos queres hacer no sería modificar una
>>> clase, sino volver a definirla; si es así las respuestas que te daban Darni
>>> y taku me parece que estaban apuntadas a modificar el mismo objeto. Lo que
>>> vos mostras en el notebook sigue siendo así en python 3.
>>>
>>> O sea, si vos haces:
>>>
>>> class A:
>>>  <<ponga su definicion aqui>>
>>>
>>> y luego,
>>>
>>> class A:
>>> << ponga su otra definicion aqui>>
>>>
>>> eso no modifica el objeto original que estaba asociado a "A", sino que
>>> genera uno nuevo y vuelve a asociar el nombre. En este caso las instancias
>>> quedan haciendo referencia al objeto anterior.
>>>
>>> In [1]: class A(): pass
>>> In [2]: x = A
>>> In [3]: a = A()
>>> In [4]: class A(): pass
>>> In [5]: x == A
>>> Out[5]: False
>>> In [6]: a.__class__ == A
>>> Out[6]: False
>>> In [7]: a.__class__ == x
>>> Out[7]: True
>>>
>>> Saludos
>>>
>>>
>>>
>>>> El 31 de agosto de 2016, 12:41, Javier Burroni <
>>>>> javier.burroni en gmail.com
>>>>> <javascript:_e(%7B%7D,'cvml','javier.burroni en gmail.com');>> escribió:
>>>>>
>>>>>> El problema es este:
>>>>>>
>>>>>> Escribo mi clase y le pongo el método "pirulin". Me hago un par de
>>>>>> instancias (que puede ser un proceso costoso). Luego, me doy cuenta que
>>>>>> pirulin no están piola como método, y que además necesito otro método:
>>>>>> barquillo. Modifico la clase para agregar el nuevo método y arreglar el que
>>>>>> ya estaba. Ahora, tendría que volver a crear las instancias. Eso es lo que
>>>>>> me quiero evitar.
>>>>>> Esto aparece mucho si usamos python en un ambiente interactivo, como
>>>>>> el notebook o la consola.
>>>>>> Que las instancias usen las nuevas clases es el comportamiento
>>>>>> default de ruby (creo) y smalltalk (seguro)
>>>>>>
>>>>>> 2016-08-31 11:35 GMT-04:00 Daniel Moisset <dmoisset en machinalis.com
>>>>>> <javascript:_e(%7B%7D,'cvml','dmoisset en machinalis.com');>>:
>>>>>>
>>>>>>> No se si entendí bien a que problema le estas apuntando... las
>>>>>>> clases de algun modo son la parte "compartida" de sus instancias, por eso
>>>>>>> modificar una afrecta a todos. Que necesitas hacer que no puedas lograr
>>>>>>> modificando la instancia en vez de la clase?
>>>>>>>
>>>>>>> Saludos,
>>>>>>>     D.
>>>>>>>
>>>>>>> 2016-08-31 16:21 GMT+01:00 Javier Burroni <javier.burroni en gmail.com
>>>>>>> <javascript:_e(%7B%7D,'cvml','javier.burroni en gmail.com');>>:
>>>>>>>
>>>>>>>> Hola, como están?
>>>>>>>> Hay algo que me resulta un poco incomodo: Cuando modifico una
>>>>>>>> clase, las instancias referencian a la anterior versión de la clase. Esto
>>>>>>>> es discutible, con ventajas y desventajas, pero para lo que uso python el
>>>>>>>> 99,9% de las veces, me resulta incomodo.
>>>>>>>> Quería ver si existe alguna forma de solucionar esto (o modificar
>>>>>>>> este comportamiento)
>>>>>>>> Hice un pequeño código con metaclases que soluciona el problema en
>>>>>>>> el caso mas simple. Tengo entendido que en python 3 hay ephemerons, así que
>>>>>>>> la solución podría quedar un poco mas prolija.
>>>>>>>> El código es solamente para probar la idea:
>>>>>>>> https://gist.github.com/jburroni/0a2db81ba541e1d8dc632368fd7f8982
>>>>>>>> pero me interesa saber si hay alguna solución standard
>>>>>>>>
>>>>>>>> saludos
>>>>>>>> jb
>>>>>>>>
>>>>>>>> --
>>>>>>>> " To be is to do " ( Socrates )
>>>>>>>> " To be or not to be " ( Shakespeare )
>>>>>>>> " To do is to be " ( Sartre )
>>>>>>>> " Do be do be do " ( Sinatra )
>>>>>>>>
>>>>>>>> _______________________________________________
>>>>>>>> pyar mailing list pyar en python.org.ar
>>>>>>>> <javascript:_e(%7B%7D,'cvml','pyar en python.org.ar');>
>>>>>>>> http://listas.python.org.ar/listinfo/pyar
>>>>>>>>
>>>>>>>> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>>>>>>>>
>>>>>>>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre
>>>>>>>> de Argentina - http://www.usla.org.ar
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> Daniel F. Moisset - UK Country Manager
>>>>>>> www.machinalis.com
>>>>>>> Skype: @dmoisset
>>>>>>>
>>>>>>> _______________________________________________
>>>>>>> pyar mailing list pyar en python.org.ar
>>>>>>> <javascript:_e(%7B%7D,'cvml','pyar en python.org.ar');>
>>>>>>> http://listas.python.org.ar/listinfo/pyar
>>>>>>>
>>>>>>> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>>>>>>>
>>>>>>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre
>>>>>>> de Argentina - http://www.usla.org.ar
>>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> " To be is to do " ( Socrates )
>>>>>> " To be or not to be " ( Shakespeare )
>>>>>> " To do is to be " ( Sartre )
>>>>>> " Do be do be do " ( Sinatra )
>>>>>>
>>>>>> _______________________________________________
>>>>>> pyar mailing list pyar en python.org.ar
>>>>>> <javascript:_e(%7B%7D,'cvml','pyar en python.org.ar');>
>>>>>> http://listas.python.org.ar/listinfo/pyar
>>>>>>
>>>>>> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>>>>>>
>>>>>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre
>>>>>> de Argentina - http://www.usla.org.ar
>>>>>>
>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> NATS
>>>>> *Cuando le preguntaron adonde queria llegar  Charlie Parker contesto:*
>>>>> *"Quiero llegar a notas hermosas"*"
>>>>>
>>>>> P *Please consider the environment before printing this email*
>>>>> *Por favor, tené en cuenta el medio ambiente antes de imprimir este
>>>>> imail. *
>>>>> *Join the campaign at http://thinkBeforePrinting.org
>>>>> <http://thinkbeforeprinting.org/> *
>>>>>
>>>>> _______________________________________________
>>>>> pyar mailing list pyar en python.org.ar
>>>>> <javascript:_e(%7B%7D,'cvml','pyar en python.org.ar');>
>>>>> http://listas.python.org.ar/listinfo/pyar
>>>>>
>>>>> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>>>>>
>>>>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
>>>>> Argentina - http://www.usla.org.ar
>>>>>
>>>>
>>>>
>>>>
>>>> --
>>>> " To be is to do " ( Socrates )
>>>> " To be or not to be " ( Shakespeare )
>>>> " To do is to be " ( Sartre )
>>>> " Do be do be do " ( Sinatra )
>>>>
>>>> _______________________________________________
>>>> pyar mailing list pyar en python.org.ar
>>>> <javascript:_e(%7B%7D,'cvml','pyar en python.org.ar');>
>>>> http://listas.python.org.ar/listinfo/pyar
>>>>
>>>> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>>>>
>>>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
>>>> Argentina - http://www.usla.org.ar
>>>>
>>>
>>>
>>> _______________________________________________
>>> pyar mailing list pyar en python.org.ar
>>> <javascript:_e(%7B%7D,'cvml','pyar en python.org.ar');>
>>> http://listas.python.org.ar/listinfo/pyar
>>>
>>> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>>>
>>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
>>> Argentina - http://www.usla.org.ar
>>>
>>
>>
>>
>> --
>> " To be is to do " ( Socrates )
>> " To be or not to be " ( Shakespeare )
>> " To do is to be " ( Sartre )
>> " Do be do be do " ( Sinatra )
>>
>> _______________________________________________
>> pyar mailing list pyar en python.org.ar
>> <javascript:_e(%7B%7D,'cvml','pyar en python.org.ar');>
>> http://listas.python.org.ar/listinfo/pyar
>>
>> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>>
>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
>> Argentina - http://www.usla.org.ar
>>
>
>
>
> --
> Daniel F. Moisset - UK Country Manager
> www.machinalis.com
> Skype: @dmoisset
>


-- 
" To be is to do " ( Socrates )
" To be or not to be " ( Shakespeare )
" To do is to be " ( Sartre )
" Do be do be do " ( Sinatra )
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20160831/57b8b759/attachment-0001.html>


Más información sobre la lista de distribución pyar