king kikapu wrote: > Your example Dennis, work as expected. I understand the mistake i have > made. But when i try to fix the original code usihn @property now, it > gives me the same error. > So, here it is: > > class Person(object): > _age = 0 > > @property > def age(): > def fget(self): > return self._age > def fset(self, value): > self._age = value > > me = Person() > me.age = 34 > print me.age > > > I am sure it is something very obvious but my skills does not (yet) > enable me to figure this out,,,
@decorator def f(): # ... is the same as def f(): # ... f = decorator(f()) What happens when your age() function is invoked? There is no explicit return statement, so None is implicitly returned, and age = property(age()) is the same as age = property(None) i. e. you get a property with None as the getter. What you want is >>> def star_property(f): ... return property(**f()) ... >>> class Person(object): ... _age = "unknown" ... @star_property ... def age(): ... def fget(self): ... return self._age ... def fset(self, value): ... self._age = value ... return locals() ... >>> person = Person() >>> person.age 'unknown' >>> person.age = 42 >>> person.age 42 However, that is rather hackish, and I recommend that you stick with the standard approach given by Dennis and limit the use of property as a decorator to read-only attributes: >>> class Forever42(object): ... @property ... def age(self): return 42 ... >>> Forever42().age 42 Peter -- http://mail.python.org/mailman/listinfo/python-list