Короткий ответ
@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Что использовать на практике
- Валидация. Используй сеттер, чтобы не дать записать некорректное значение, например температуру ниже абсолютного нуля.
- Вычисляемые поля. Отдавай через свойство значения, вычисляемые из других атрибутов, сохраняя простой интерфейс доступа.
- Обратная совместимость. Переводи обычный атрибут в свойство, когда позже понадобится контроль доступа, не меняя вызывающий код.
Подводные камни
- Одно имя. Геттер и сеттер должны называться одинаково, иначе сеттер не свяжется со свойством.
- Рекурсия в сеттере. Без внутреннего атрибута с подчёркиванием присваивание в сеттере будет вызывать само себя.
- Тяжёлые вычисления. Не прячь в свойство долгие операции: доступ к атрибуту не должен неожиданно тормозить.
Как отвечать на собеседовании
- Дай определение
@propertyкак декоратора, превращающего метод в атрибут → объясни связку геттера и сеттера с проверками → приведи пример класса Celsius → упомяни, когда свойства оправданы, и предупреди про рекурсию в сеттере без внутреннего атрибута.