Короткий ответ
@property — встроенный декоратор, который объявляет метод класса как свойство: обращаться к его результату можно как к обычному атрибуту, без скобок. По сути это синтаксический сахар над функцией property(), которой передаются методы-геттер, сеттер и делетер.
Как это работает подробнее
Такой подход называют управляемыми атрибутами: снаружи поле выглядит обычным, а внутри допускает проверки, вычисления и логирование.
- Геттер. Метод, помеченный
@property, возвращает значение внутреннего атрибута, который по соглашению хранится с одним подчёркиванием. - Сеттер. Метод с декоратором
@имя_свойства.setterвызывается при присваиванииobj.attribute = valueи может проверить корректность нового значения. - Делетер. Метод с декоратором
@имя_свойства.deleterобрабатывает операторdel obj.attribute. - Типичный сценарий. Контроль доступа к атрибуту: значение хранится во внутреннем поле, а доступ к нему идёт через геттер и сеттер с валидацией.
Пример кода
Свойство temperature с проверкой в сеттере
class Celsius:
def __init__(self, temp=0):
self._temperature = temp
@property
def temperature(self): # геттер
return self._temperature
@temperature.setter
def temperature(self, value): # сеттер с проверкой
if value < -273.15:
raise ValueError('Температура ниже абсолютного нуля!')
self._temperature = value
c = Celsius(25)
print(c.temperature) # 25 — доступ как к атрибуту
c.temperature = 30 # срабатывает сеттер
# c.temperature = -300 # ValueErrorЧто использовать на практике
- Валидация. Используй сеттер, чтобы не дать записать некорректное значение, например температуру ниже абсолютного нуля.