Освойте Python на курсе от Skypro. Вас ждут 400 часов обучения и практики (достаточно десяти часов в неделю), подготовка проектов для портфолио, индивидуальная проверка домашних заданий и помощь опытных наставников. Получится, даже если у вас нет опыта в IT.
Существует ряд функциональных возможностей в Python, которые могут вызвать вопросы у новичков. Одной из таких является функция property
, которую можно использовать как встроенную функцию, так и в качестве декоратора.
Для начала рассмотрим простой пример использования property
как встроенной функции:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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
как декоратора:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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 |
На курсе Skypro «Python-разработчик» освоите основные инструменты программирования, получите опыт на реальных проектах и сможете стартовать в профессии уверенным новичком. Преподаватели — практикующие программисты с большим опытом, а в центре карьеры помогут составить цепляющее резюме и подготовиться к собеседованию.
В данном примере 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
мы можем сделать методы класса доступными как обычные атрибуты, что упрощает их использование.
Добавить комментарий