[pyar] consulta sobre la utilización de la función setattr

Nicolas Rebagliati nicolas.rebagliati en aenima-x.com.ar
Mar Nov 26 11:05:57 -03 2019


Es que no esta pensado para agregar methodos.

Es para agregar atributos, y si agregas funciones se van a comportar como
metodos estaticos.

si queres agregar metodos usa MethodType

def b_func(self):
    print(self)

from types import MethodType
a.b_func = MethodType(b_func, a)

a.b_func()
<__main__.A object at 0x7ff1440b9240>

On Mon, Nov 25, 2019 at 11:00 AM Gabriel Acosta <
acostadariogabriel en gmail.com> wrote:

> Hola Miguel,
>
> Probá pasándole la clase y no la instancia a setattr, entonces deberías
> hacerlo antes de crear el objeto pj. Y en ese caso hasta no haría falta
> usar setattr.
>
> Saludos
>
>
> On Mon, Nov 25, 2019, 10:22 AM Miguel Barraza <correo en miguelbarraza.com.ar>
> wrote:
>
>> Buenas, estoy investigando sobre la metaprogramación en python, y no me
>> queda muy claro la utilización de la función setattr para agregar metodos
>> de forma dinámica a una instancia. si yo agrego una función como método a
>> una instancia, debería tomar el contexto y recibir self como primer
>> parámetro, pero no pasa... ejemplo:
>> setattr(obj, "nombre", funcion)
>>
>> yo calcularía que debería crear:
>> def funcion(self):
>>     # codigo...
>>
>> pero si hago eso me dice que espera un parametro, como que no estaría
>> recibiendo el self... para que lo reciba tengo que poner:
>> setattr(obj, "nombre", lambda: funcion(obj))
>>
>> es la unica forma que se me ocurrió para que funcione, creo que lo estoy
>> haciendo mal... alguien me podría tirar alguna luz sobre este tema, ¿de que
>> forma tengo que usar setattr para que reciba el contexto y la función
>> agregada reciba el self sin usar el lambda?.
>>
>> muestro un ejemplo de código donde lo pruebo con el lambda y funciona:
>> y no se si habrá otra forma de hacer lo mismo pero sin usar el lambda.
>>
>> --- ejemplo ---
>> class pj():
>>     def __init__(self):
>>         self.edad = 1
>>
>> alguien = pj()
>> print("edad de alguien", alguien.edad)
>>
>> def crecer(self):
>>   self.edad+=1
>>
>> setattr(alguien, "crecer", lambda: crecer(alguien))
>>
>> alguien.crecer()
>> print("ahora tiene", alguien.edad)
>> --- fin del ejemplo ---
>>
>> gracias.
>>
>> atte, Miguel
>> _______________________________________________
>> Lista de Correo de PyAr - Python Argentina - pyar en python.org.ar
>> Sitio web: http://www.python.org.ar/
>>
>> Para administrar la lista (o desuscribirse) entrar a
>> http://listas.python.org.ar/listinfo/pyar
>>
>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
>> Argentina - http://www.usla.org.ar
>
> _______________________________________________
> Lista de Correo de PyAr - Python Argentina - pyar en python.org.ar
> Sitio web: http://www.python.org.ar/
>
> Para administrar la lista (o desuscribirse) entrar a
> http://listas.python.org.ar/listinfo/pyar
>
> 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/20191126/42707267/attachment.html>


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