Ответ
Декоратор @property в Python позволяет превратить метод класса в "виртуальный" атрибут. Это дает возможность выполнять дополнительную логику (например, валидацию или вычисления) при доступе к атрибуту, сохраняя при этом простой синтаксис обращения к нему.
Основные преимущества:
- Инкапсуляция и контроль доступа: Позволяет скрыть внутреннюю реализацию атрибута и предоставить управляемый публичный интерфейс.
- Валидация данных: Можно добавить проверку значения перед его присвоением, как в примере ниже.
- "Ленивые" вычисления: Значение атрибута может вычисляться только в момент первого обращения к нему, а не при инициализации объекта.
Пример: Класс с валидацией радиуса
class Circle:
def __init__(self, radius):
# Внутренний атрибут для хранения значения
self._radius = radius
@property
def radius(self):
"""Геттер: возвращает значение _radius"""
print("Getting radius")
return self._radius
@radius.setter
def radius(self, value):
"""Сеттер: проверяет значение перед установкой"""
if not isinstance(value, (int, float)) or value <= 0:
raise ValueError("Радиус должен быть положительным числом")
print(f"Setting radius to {value}")
self._radius = value
# Использование
c = Circle(10)
print(c.radius) # Обращение как к атрибуту, вызывается геттер
c.radius = 15 # Присвоение как атрибуту, вызывается сеттер
try:
c.radius = -5 # Вызовет ValueError
except ValueError as e:
print(e)
Таким образом, @property обеспечивает более гибкое и безопасное управление состоянием объекта, не усложняя его использование.