[pyar] Modificación de clases e instancias

Javier Burroni javier.burroni en gmail.com
Mie Ago 31 15:57:35 ART 2016


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


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