[pyar] Modificación de clases e instancias

Daniel Moisset dmoisset en machinalis.com
Mie Ago 31 14:15:31 ART 2016


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


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