← Назад ко всем вопросам

Что такое декоратор property

1️⃣ Как кратко ответить

Декоратор @property в Python используется для создания свойств класса, которые позволяют управлять доступом к атрибутам объекта. Он позволяет определить методы для получения, установки и удаления значений атрибутов, обеспечивая инкапсуляцию и контроль над изменениями данных.

2️⃣ Подробное объяснение темы

Декоратор @property в Python предоставляет способ управления доступом к атрибутам объекта через методы, которые выглядят как обычные атрибуты. Это позволяет инкапсулировать логику получения и изменения значений, сохраняя при этом удобный синтаксис доступа.

Зачем это нужно

  1. Инкапсуляция: Позволяет скрыть внутреннюю реализацию и предоставить контролируемый доступ к данным.
  2. Валидация данных: Можно добавить проверку данных при их установке.
  3. Упрощение интерфейса: Позволяет использовать методы как атрибуты, что делает код более читаемым и удобным.

Как это работает

Декоратор @property используется для создания геттеров, а для создания сеттеров и делетеров используются декораторы @<property_name>.setter и @<property_name>.deleter соответственно.

Пример кода

class Circle:
    def __init__(self, radius):
        self._radius = radius
​
    @property
    def radius(self):
        """Геттер для атрибута radius."""
        return self._radius
​
    @radius.setter
    def radius(self, value):
        """Сеттер для атрибута radius с валидацией."""
        if value < 0:
            raise ValueError("Радиус не может быть отрицательным")
        self._radius = value
​
    @property
    def area(self):
        """Геттер для вычисляемого атрибута area."""
        return 3.14159 * (self._radius ** 2)
​
# Пример использования
circle = Circle(5)
print(circle.radius)  # Вывод: 5
print(circle.area)    # Вывод: 78.53975
​
circle.radius = 10    # Устанавливаем новый радиус
print(circle.area)    # Вывод: 314.159
​
# circle.radius = -5  # Это вызовет ValueError

Объяснение кода

  • __init__ метод: Инициализирует объект Circle с атрибутом _radius.
  • @property для radius: Определяет метод radius как геттер, который возвращает значение _radius.
  • @radius.setter: Определяет метод для установки значения radius. Включает проверку, чтобы радиус не мог быть отрицательным.
  • @property для area: Определяет метод area как геттер, который вычисляет и возвращает площадь круга на основе текущего значения _radius.
  • Использование: Создается объект circle, и через свойства radius и area можно получать и изменять значения, как если бы это были обычные атрибуты, но с дополнительной логикой валидации и вычисления.

Тема: Python
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки