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