property
Peter Otten
__peter__ at web.de
Fri Jun 26 09:12:50 EDT 2020
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
More information about the Python-list
mailing list