[pyar] Modificación de clases e instancias

Sofi Denner sofi.denner en gmail.com
Mie Ago 31 15:38:51 ART 2016


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
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20160831/e5cd2b6b/attachment-0001.html>


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