[pyar] Modificación de clases e instancias
Sofi Denner
sofi.denner en gmail.com
Mie Ago 31 16:58:36 ART 2016
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/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
> 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
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20160831/8cb65a48/attachment-0001.html>
Más información sobre la lista de distribución pyar