Unknown wrote: > Hello, > > I am wondering why this code is OK: > > class Temperature: > def __init__(self): > self.celsius = 0 > > fahrenheit = property() > > @fahrenheit.getter > def fahrenheit(self): > return 9/5*self.celsius +32 > > @fahrenheit.setter > def fahrenheit(self, value): > self.celsius = (value-32)*5/9 > > > and this one is not: > > > class Temperature: > def __init__(self): > self.celsius = 0 > > fahrenheit = property() > > @fahrenheit.getter > def f(self): > return 9/5*self.celsius +32 > > @fahrenheit.setter > def f(self, value): > self.celsius = (value-32)*5/9 > > In the second code, I just changed the names of the > decorated functions
> @fahrenheit.getter > def f(self): is syntactic sugar for def f(self): ... f = fahrenheit.getter(f) > Unforunately I was not able to find "property" source > code to understand how it works exactly The getter/setter of the property builtin return a new property >>> p = property() >>> q = p.getter(None) >>> p is q False where you > def getter(self, fget): > self.fget = fget > return self modify the existing one. > I wrote a my_property which makes the two previous codes > to work fine. This is why I don't understand why the > genuine property does't work when decorated functions > are named f rather than fahrenheit > > Here it is: > > class my_property: > > def __init__(self, fget=None, fset=None, fdel=None): > self.fget = fget > self.fset = fset > self.fdel = fdel > > def __get__(self, instance, owner): > if instance is None: > return self > return self.fget(instance) > > def __set__(self, instance, value): > self.fset(instance, value) > > def __delete__(self, instance): > self.fdel(instance) > > def getter(self, fget): > self.fget = fget > return self > > def setter(self, fset): > self.fset = fset > return self > > def deleter(self, fdel): > self.fdel = fdel > return self -- https://mail.python.org/mailman/listinfo/python-list