Что такое @property и геттеры/сеттеры простыми словами?
Видел @property над методом, и потом к нему обращаются как к атрибуту, без скобок. Зачем так, если можно просто хранить атрибут?
3 ответа
@property позволяет обращаться к методу как к обычному атрибуту (без скобок), но при этом внутри выполнять код — например проверку или вычисление.
Зачем: иногда нужно при чтении что-то посчитать, а при записи — проверить значение, но не хочется ломать удобный синтаксис obj.x. Классический пример — валидация:
class Temperature:
def __init__(self, celsius):
self._celsius = celsius
@property
def celsius(self): # геттер
return self._celsius
@celsius.setter
def celsius(self, value): # сеттер
if value < -273.15:
raise ValueError("ниже абсолютного нуля нельзя")
self._celsius = value
t = Temperature(20)
t.celsius = 25 # вызовется сеттер с проверкой
print(t.celsius) # вызовется геттер -> 25
Идея в том, что снаружи это выглядит как простое поле, а внутри можно добавить логику в любой момент, не переписывая код, который уже им пользуется.
Это "умный атрибут". Снаружи obj.celsius, а под капотом — функция. Удобно, когда хочешь начать с простого поля, а потом добавить проверку, не меняя интерфейс.
Чтобы не плодить get_x() / set_x() как в джаве.