[pyar] Modificación de clases e instancias

Javier Burroni javier.burroni en gmail.com
Mie Ago 31 17:40:42 ART 2016


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> 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
> <javascript:_e(%7B%7D,'cvml','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
>> <javascript:_e(%7B%7D,'cvml','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/
>>>>>>>>>>>>> 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
>>>>>>>>>>>>> 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
>> <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 )
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20160831/65c2f056/attachment-0001.html>


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