[pyar] Duda: @property con __(set|get)attr__

Germán L. Osella Massa gosella en gmail.com
Mie Feb 13 16:09:09 ART 2013


Buenas!

Dos cuestiones que explican este comportamiento que observás:

Por un lado, __getattr__() se llama únicamente cuando la instancia no tiene
el atributo buscado. Si lo tiene, no se invoca.
El método que se llama para obtener cualquier atributo de una instancia
(independientemente de si existe o no) es __getattribute__().
Eso explica porqué __getattr__() no se invoca cuando querés acceder a la
property.


Por otro lado, __setattr__() se invoca para cualquier asignación de un
atributo de una instancia (sería el simétrico de __getattribute__(), no de
__getattr__() pero bue...).
__setattr__() es el encargado de hacer funcionar la "magia" de las
properties (es decir, si el atributo existe y es un descriptor, llama al
setter en lugar de asignarle el nuevo valor directamente al atributo). El
tema es que en tu código no están invocando al método __setattr__()
original, causando que no se realice el comportamiento esperado de las
properties.

Si agregás a tu código la llamada a la superclase:

def __setattr__(self, key, value):
    print("__setattr__", key, value)
    return super().__setattr__(key, value)

Vas a ver que ahí funciona la cosa.

Saludos,
Germán



El 9 de febrero de 2013 19:53, Gabriel Lopez <injaon en gmail.com> escribió:

> Hola lista! Tengo una pequeña duda que quiero compartir con ustedes.
>
> Tengo una clase que usa el decorador property y a su vez define metodos
> __setattr__ y __getattr__.
> El compartmiento es extraño porque usa el getter de property y para un
> setter llama a __setattr__
> No los mareo mas, aca hay un paste que explica la situacion
>
> http://paste.ubuntu.com/1631056/
>
> Lo que yo quiero es que use el setter y getter de property. Como lo puedo
> hacer?
>
> Saludos
> Gabriel Lopez
>
>
> _______________________________________________
> 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/20130213/158ee31c/attachment.html>


More information about the pyar mailing list