[pyar] Modificación de clases e instancias
Daniel Moisset
dmoisset en machinalis.com
Mie Ago 31 14:46:49 ART 2016
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
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20160831/64f89656/attachment-0001.html>
Más información sobre la lista de distribución pyar