Я изучаю Python, и с @ property происходит одна странная вещь, которую я не понимаю ...
Я нашел пример здесь о том, как работает свойство, и нашел его довольно понятным.
Следующий код работает нормально:
class Celsius:
def __init__(self, temperature=0):
self.temperature = temperature
def to_farenheit(self):
return (self.temperature * 1.8) + 32
def get_temperature(self):
print("Getting value") # just to see on screen when we call it
return self._temperature
def set_temperature(self, value):
print("Setting value") # just to see on screen when we call it
if value < -273:
raise ValueError("Temperature cannot be less than -273 °C !")
self._temperature = value
temperature = property(get_temperature, set_temperature)
Когда мы пытаемся установить температуру ниже абсолютного нуля, мы видим, что вызывается установщик и возникает ошибка ValueError:
T = Celsius(-400)
>>> Setting value
>>> Traceback (most recent call last):
>>> ...
>>> ValueError: Temperature cannot be less than -273 °C !
Однако, когда мы определяем свойство как декоратор (т.е. @ property ), как показано в коде ниже:
class Celsius:
def __init__(self, temperature = 0):
self._temperature = temperature
def to_fahrenheit(self):
return (self.temperature * 1.8) + 32
@property
def temperature(self):
print("Getting value")
return self._temperature
@temperature.setter
def temperature(self, value):
print("Setting value")
if value < -273:
raise ValueError("Temperature below -273 is not possible")
print("Setting value")
self._temperature = value
И мы делаем то же самое, сеттер не вызывается и исключение не вызывается:
T = Celsius(-400)
print(T.temperature)
>>> Getting value
>>> -400
Похоже, что @tempera.setter никогда не вызывается, даже когда мы меняем значение T:
T = Celsius(20)
print(T.temperature)
>>> Getting value
>>> -400
Я не понимаю ... кто-то может мне это объяснить?