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