[pyar] Modificación de clases e instancias

Javier Burroni javier.burroni en gmail.com
Mie Ago 31 19:05:01 ART 2016


A esta me refería:
http://nbviewer.jupyter.org/gist/jburroni/0a2db81ba541e1d8dc632368fd7f8982

On Wednesday, August 31, 2016, Javier Burroni <javier.burroni en gmail.com>
wrote:

> Interesante solución, pero creo que voy a usar la metaclase, me resulta un
> poco más transparente
>
> On Wednesday, August 31, 2016, Sofi Denner <sofi.denner en gmail.com
> <javascript:_e(%7B%7D,'cvml','sofi.denner en gmail.com');>> wrote:
>
>> Capaz que no es exactamente lo que preguntás, pero yo lo solucionaría con
>> dos celdas:
>>
>> - en la primera podés crear clases "vacías":
>> class Clase():
>>    pass
>>
>> - en la segunda definís todo lo que querés:
>> Clase.parametro = "bla"
>> def pirulin():
>>   print("pirulin")
>> Clase.pirulin = pirulin
>> ...
>>
>> A la primer celda no le des *nunca *shift enter, y siempre que quieras
>> modificar algo modificá en la segunda celda, así se actualiza en todas las
>> instancias.
>>
>> Por ahí no es lo más práctico del mundo, pero te puede servir.
>>
>> Saludos!
>>
>>
>> El mié., 31 de ago. de 2016 a la(s) 15:57, Javier Burroni <
>> javier.burroni en gmail.com> escribió:
>>
>>> Si, fui incorrecto en lo que dije.
>>> Me refería a escribir una clase con el mismo nombre, que es lo que
>>> ocurre en el notebook cuando volvemos a hacer shift enter en la celda donde
>>> tenemos la definición de la clase.
>>>
>>>
>>> On Wednesday, August 31, 2016, Sofi Denner <sofi.denner en gmail.com>
>>> wrote:
>>>
>>>> No se si entendí bien, pero me parece que hay una confusión entre
>>>> "modificar una clase" y "escribir una clase nueva con el mismo nombre".
>>>>
>>>> Si creas instancias, y luego *modificas *la clase, tus instancias se
>>>> modifican también.
>>>>
>>>> Si escribís una nueva clase, con el mismo nombre de la anterior,
>>>> tus instancias no se van a modificar. Porque lo que creaste es una clase
>>>> diferente (tiene el mismo nombre pero es un objeto diferente).
>>>>
>>>> En el ejemplo de Darni:
>>>>
>>>> class Clase:
>>>>     def pirulin(self): print("pirulin")
>>>> inst1 = Clase()
>>>> inst2 = Clase()
>>>> def barquillo(self): print("barquillo")
>>>> Clase.barquillo = barquillo
>>>> inst3 = Clase()
>>>>
>>>> Si hacés inst1.barquillo() va a imprimir "barquillo", porque se
>>>> modificó la clase, agregando ese nuevo método.
>>>>
>>>> También podés modificar el método pirulin, y se va a modificar en todas
>>>> las instancias:
>>>>
>>>> def pirulin(self):
>>>>   print("pirulin reloaded")
>>>>
>>>> Clase.priulin = pirulin
>>>>
>>>>
>>>> Ojalá te sirva.
>>>>
>>>> Saludos!
>>>>
>>>>
>>>>
>>>>
>>>> El mié., 31 de ago. de 2016 a la(s) 15:14, Daniel Moisset <
>>>> dmoisset en machinalis.com> escribió:
>>>>
>>>>> Entonces no entiendo. El primer comportamiento que te dije al cambiar
>>>>> la clase es lo que haces si queres que se cambien las instancias viejas:
>>>>>
>>>>> class Clase:
>>>>>     def pirulin(self): print("pirulin")
>>>>> inst1 = Clase()
>>>>> inst2 = Clase()
>>>>> def barquillo(self): print("barquillo")
>>>>> Clase.barquillo = barquillo
>>>>> inst3 = Clase()
>>>>> # Aca inst1 e inst2 e inst3 tienen pirulin y  barquillo
>>>>>
>>>>> Lo segundo que te tire es si no queres que cambien las instancias
>>>>> viejas. Si ninguno de los dos te sirve, estaria bueno que tires un snippet
>>>>> de codigo del estilo "defino las clases/instancias asi «...» , haga la
>>>>> llamada «...», y obtengo como resultado «...» pero quería algo que me de el
>>>>> resultado «...»". Sino sospecho que estoy contstando preguntas que no
>>>>> hiciste
>>>>>
>>>>> Saludos,
>>>>>     D.
>>>>>
>>>>>
>>>>> 2016-08-31 18:31 GMT+01:00 Javier Burroni <javier.burroni en gmail.com>:
>>>>>
>>>>>> 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>
>>>>>>> :
>>>>>>>
>>>>>>>> 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>:
>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> El 31 de agosto de 2016, 13:22, Javier Burroni<
>>>>>>>>> javier.burroni en gmail.com> escribió:
>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> 2016-08-31 11:59 GMT-04:00 Nats <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> 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>:
>>>>>>>>>>>>
>>>>>>>>>>>>> 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>:
>>>>>>>>>>>>>
>>>>>>>>>>>>>> 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/0a2db81ba541e1d8dc632
>>>>>>>>>>>>>> 368fd7f8982 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
>>>>>>>>>>>>>> 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
>>>>>>>>>>>>> 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
>>>>>>>>>>>> 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
>>>>>>>>>>> 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
>>>>>>>>>> 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
>>>>>>>>> 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
>>>>>>>> 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 )
>>>>>>
>>>>>> _______________________________________________
>>>>>> pyar mailing list 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
>>>>> 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
>>> 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 )
>


-- 
" 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/c8a70fa0/attachment-0001.html>


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