Найти в Дзене
Gross QB

Декораторы в Python

Для придания новой функциональности уже существующему коду в Python есть очень интересный инструмент под названием декоратор․ Декораторы принимают функцию‚ добавляют в нее некоторую функциональность и возвращают ее обратно․ Из данной статьи вы узнаете‚ как создавать декораторы и зачем это нужно делать․ Чтобы понять что такое декораторы‚ вы должны знать несколько базовых вещей в Python․ В первую очередь вас не должно удивлять‚ что в Python все является объектами․ Задаваемые нами имена – это просто идентификаторы‚ привязанные к конкретным объектам․ Функции также не являются исключением‚ это такие же объекты со своими атрибутами․ К одной и той же функции может быть привязано несколько совершенно разных имен․ При работе данного кода обе функции‚ first и second‚ дают один и тот же результат․ Это оттого‚ что имена first и second относятся к одному объекту․ Функции могут быть переданы в качестве аргументов в другие функции‚ например функции как map‚ filter или reduce‚ принимают функцию в каче
Оглавление
Декораторы в Python
Декораторы в Python

Для придания новой функциональности уже существующему коду в Python есть очень интересный инструмент под названием декоратор․

Декораторы принимают функцию‚ добавляют в нее некоторую функциональность и возвращают ее обратно․ Из данной статьи вы узнаете‚ как создавать декораторы и зачем это нужно делать․

Чтобы понять что такое декораторы‚ вы должны знать несколько базовых вещей в Python․

В первую очередь вас не должно удивлять‚ что в Python все является объектами․ Задаваемые нами имена – это просто идентификаторы‚ привязанные к конкретным объектам․ Функции также не являются исключением‚ это такие же объекты со своими атрибутами․ К одной и той же функции может быть привязано несколько совершенно разных имен․

-2

При работе данного кода обе функции‚ first и second‚ дают один и тот же результат․ Это оттого‚ что имена first и second относятся к одному объекту․

Функции могут быть переданы в качестве аргументов в другие функции‚ например функции как mapfilter или reduce‚ принимают функцию в качестве аргумента․

Такие функции в Python называются функциями высшего порядка

функции высшего порядка
функции высшего порядка

Функция также может возвращать другую функцию․

-4

Здесь is_returned() – это вложенная функция‚ так как она определена внутри функции is_called()․ И она возвращается каждый раз‚ как только мы вызываем is_called()

Функции и методы в Python являются вызываемыми объектами‚ поскольку могут быть вызваны․

Фактически‚ любой объект в Python‚ для которого реализован специальный метод __call__()‚ является вызываемым․ Таким образом‚ в наиболее общем смысле декоратор является вызываемым объектом и также возвращает вызываемый объект․

В общем и целом‚ декоратор принимает функцию‚ добавляет в нее некоторую функциональность и возвращает её․

-5

В данном примере функция make_pretty() является декоратором․ Декорирование происходит вот на этом шаге։

pretty = make_pretty(ordinary)

Функция ordinary() теперь задекорирована и возвращаемая функция носит имя pretty()

Мы видим‚ что декоратор добавил некоторую новую функциональность в первоначальную функцию․ Это напоминает упаковку для подарка․ Декоратор играет роль такой упаковки․ Суть самого объекта в результате декорирования не меняется․ Но теперь этот объект выглядит симпатичнее․

Обычно мы декорируем и переопределяем функцию следующим образом։

pretty = make_pretty(ordinary)

Это довольно частая конструкция‚ и поэтому в Python есть синтаксис для ее упрощения․

Мы используем символ @ перед названием функции и помещаем его прямо над объявлением функции‚ которая должна быть задекорирована․ Например։

@ Декоратор
@ Декоратор

Декорирование функций с параметрами

Разобранный нами декоратор был очень простым и мог работать только с функциями без параметров․ А как быть‚ если у функции есть параметры?

Декорирование функций с параметрами
Декорирование функций с параметрами

Внимательный читатель может заметить‚ что вложенная внутри декоратора функция inner() имеет те же параметры‚ что и функция‚ которую мы декорируем․ Приняв это во внимание‚ мы теперь можем построить декоратор для функции с произвольным количеством параметров․

В Python это выглядит следующим образом։ function(*args‚ **kwargs)․ Здесь *args – это кортеж позиционных аргументов‚ а **kwargs – словарь ключевых аргументов․ Вот пример такого декоратора։

*args‚ **kwargs
*args‚ **kwargs

Создание цепочек декораторов

В Python может последовательно применяться сразу несколько декораторов․

Функция может быть декорирована несколько раз разными декораторами․ Мы просто помещаем эти декораторы поверх функции‚ которую хотим задекорировать․

Создание цепочек декораторов
Создание цепочек декораторов

Основы Python 3.8 #8: Функции.

Основы Python 3.8 #14:  Кортежи.

Основы Python 3.8 #15: Словари.

Мой кошелёк яндекс деньги для желающих мотивировать меня работать над каналом.