Dynamic use of property() fails

andrew cooke andrew at acooke.org
Tue Apr 15 04:50:18 EDT 2008


On Apr 15, 4:06 am, Bruno Desthuilliers <bruno.
42.desthuilli... at websiteburo.invalid> wrote:

> The canonical solution is to use a custom descriptor instead of a property:
>
> class Field(object):
>    def __init__(self, name, onchange):
>      self.name = name
>      self.onchange = onchange
>
>    def __get__(self, instance, cls):
>      if instance is None:
>          # called on the class
>          return self
>      # called on instance
>      return instance._values[self.name]
>
>    def __set__(self, instance, value):
>      instance._values[name] = self.onchange(value)
>
> class ActiveDAO(object):
>    def __init__(self):
>      self._values = []
>
> class Person(ActiveDAO):
>    name = Field('firstname', lambda v: v.strip().capitalize())
>    age = Field('age', lambda v : int(v))

i tried code very similar after reading the first replies and found
that it did not work as expected on setting.  for example, in

  person = Person()
  person.age = 27

"age" is set in the instance's dictionary (as 27; the descriptor is
not called), which then shadows the definition of age in the class
dictionary.

my understanding was that the descriptor is only called in the class
context, so would be called if, say, a subclass tried to redefine
age.  but maybe i am still confused.

i am about to go to sleep.  i guess i will try your code exactly
tomorrow, but it looks very close to mine which showed this problem.
are you sure your solution works?

thanks,
andrew



More information about the Python-list mailing list