07 Июл 2023
2 мин
610

Работа декоратора @property в Python

Существует ряд функциональных возможностей в Python, которые могут вызвать вопросы у новичков. Одной из таких является функция property, которую можно использовать

Содержание

Существует ряд функциональных возможностей в Python, которые могут вызвать вопросы у новичков. Одной из таких является функция property, которую можно использовать как встроенную функцию, так и в качестве декоратора.

Для начала рассмотрим простой пример использования property как встроенной функции:

class MyClass:
    def __init__(self):
        self._value = None

    def get_value(self):
        return self._value

    def set_value(self, value):
        self._value = value

    def del_value(self):
        del self._value

    value = property(get_value, set_value, del_value, "This is 'value' property.")

Здесь property принимает четыре аргумента: метод для получения значения (get_value), метод для установки значения (set_value), метод для удаления значения (del_value) и строку документации.

Теперь рассмотрим пример использования property как декоратора:

class MyClass:
    def __init__(self):
        self._value = None

    @property
    def value(self):
        """This is 'value' property."""
        return self._value

    @value.setter
    def value(self, value):
        self._value = value

    @value.deleter
    def value(self):
        del self._value

В данном примере property используется как декоратор для функции value. Но как создаются декораторы value.setter и value.deleter в этом случае?

В действительности, property в Python это не просто функция, а так называемый дескриптор. Дескрипторы — это особые объекты, которые имеют методы __get__, __set__ и __delete__. Метод __get__ вызывается при доступе к значению атрибута, __set__ — при присваивании значения атрибуту, а __delete__ — при удалении атрибута.

Когда property используется как декоратор, он возвращает новый объект свойства с методом __get__, который связан с декорируемой функцией. Этот новый объект свойства имеет методы setter и deleter, которые принимают функцию и возвращают новый объект свойства, связанный с этой функцией.

Таким образом, когда мы пишем @value.setter, мы фактически создаем новый объект свойства с методом __set__, связанным с функцией, которую мы декорируем. Аналогично, @value.deleter создает новый объект свойства с методом __delete__.

С помощью декоратора property мы можем сделать методы класса доступными как обычные атрибуты, что упрощает их использование.

Добавить комментарий