Каково назначение декоратора @property в Python?

Ответ

Декоратор @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 обеспечивает более гибкое и безопасное управление состоянием объекта, не усложняя его использование.