Dynamic use of property() fails

Gabriel Genellina gagsl-py2 at yahoo.com.ar
Mon Apr 14 22:06:47 EDT 2008


En Mon, 14 Apr 2008 22:43:39 -0300, andrew cooke <andrew at acooke.org>  
escribió:

> This is my first attempt at new classes and dynamic python, so I am
> probably doing something very stupid...  After reading the how-to for
> descriptors at http://users.rcn.com/python/download/Descriptor.htm I
> decided I would make an object that returns attributes on read, but on
> setting calls an arbitrary function.
>
> My code looks like:
> class ActiveDAO(object):
>     def __init__(self):
>         self.__values__ = {}
>     def add_field(self, name, value, on_change):
>         self.__values__[name] = value
>         def get(self): return self.__values__[name]
>         def set(self, new_value): self.__values__[name] =
> on_change(new_value)
>         def delete(self): raise AttributeError
>         self.__dict__[name] = property(get, set, delete)
>
> However, when I try to use this (in a test) with code like:
>     dao = ActiveDAO()
>     dao.add_field("name", "value", lambda _: None)
>     assertEqual(dao.name, "value")
>
> I get a failure because lookup of the attribute is returning
> "<property object at 0x6b8910>".
>
> That is quite reasonable, but I was under the expression that some
> magic was supposed to happen, as described in the document referenced
> above!

The "magic" happens when the descriptor is found in the *class*, not in  
the instance. I think it's detailed in Hettinger's document.
Do you actually want "per-instance" defined properties?

__special__ names are reserved for Python internal usage; don't use them.  
Implementation-only attributes ("private" ones) are spelled with a single  
underscore.


-- 
Gabriel Genellina




More information about the Python-list mailing list