Декораторы Python
Декораторы Python
Декоратор принимает функцию, добавляет некоторую функциональность и возвращает ее. В этом руководстве вы узнаете, как создать декоратор и почему вам следует его использовать.
Видео:@Decorators в Python
Декораторы в Python
В Python есть интересная функция, которая называется декораторы. для добавления функциональности к существующему коду.
Это также называется метапрограммированием. потому что часть программы пытается изменить другую часть программы во время компиляции.
<час>Предпосылки для изучения декораторов
Чтобы понять декораторы, мы должны сначала узнать несколько основных вещей в Python.
Нам должно быть комфортно с тем фактом, что все в Python (да! Даже классы) является объектами. Имена, которые мы определяем, являются просто идентификаторами, привязанными к этим объектам. Функции не являются исключением, они тоже объекты (с атрибутами). К одному и тому же функциональному объекту могут быть привязаны разные имена.
Вот пример.
06
Вывод
15пре>При запуске кода обе функции
07
и16
дать тот же результат. Здесь имена20
и35
относятся к одному и тому же функциональному объекту.Теперь все становится еще более странным.
Функции можно передавать в качестве аргументов другой функции.
Если вы использовали такие функции, как
49
,50
и60
в Python, то вы уже знаете об этом.Такие функции, которые принимают другие функции в качестве аргументов, также называются функциями более высокого порядка. . Вот пример такой функции.
23Мы вызываем функцию следующим образом.
37Кроме того, функция может возвращать другую функцию.
45
Вывод
53Здесь
72
это вложенная функция, которая определяется и возвращается каждый раз, когда мы вызываем83
.Наконец, мы должны знать о замыканиях в Python.
<час>Возвращаясь к декораторам
Функции и методы называются вызываемыми. как их можно назвать.
Фактически, любой объект, который реализует специальный код
95
метод называется вызываемым. Итак, в самом общем смысле декоратор — это вызываемый объект, который возвращает вызываемый объект.По сути, декоратор принимает функцию, добавляет некоторые функции и возвращает ее.
66Когда вы запускаете следующие коды в оболочке,
78В показанном выше примере
100
является декоратором. На этапе назначения:85Функция
110
был украшен, а возвращаемой функции было присвоено имя122
.Мы видим, что функция декоратора добавила некоторые новые функции к исходной функции. Это похоже на упаковку подарка. Декоратор действует как обертка. Характер украшенного предмета (настоящего подарка внутри) не меняется. Но теперь он выглядит красиво (поскольку его украсили).
Как правило, мы украшаем функцию и переназначаем ее как
95Это обычная конструкция, и по этой причине в Python есть синтаксис, упрощающий ее.
Мы можем использовать
134
вместе с именем функции-декоратора и поместите его над определением декорируемой функции. Например,102эквивалентно
119Это просто синтаксический сахар для реализации декораторов.
<час>Украшение функций параметрами
Приведенный выше декоратор был простым и работал только с функциями, у которых не было параметров. Что, если бы у нас были функции, принимающие такие параметры, как:
125Эта функция имеет два параметра:a и б . Мы знаем, что это выдаст ошибку, если мы передадим b как 0.
139Теперь давайте создадим декоратор для проверки этого случая, который вызовет ошибку.
141Эта новая реализация вернет
143
. если возникает состояние ошибки.154Таким образом мы можем декорировать функции, принимающие параметры.
Внимательный наблюдатель заметит, что параметры вложенного
158
Функция внутри декоратора совпадает с параметрами функций, которые он украшает. Принимая это во внимание, теперь мы можем создавать общие декораторы, работающие с любым количеством параметров.В Python эта магия выполняется как
161
. Таким образом,175
будет кортеж позиционных аргументов и189
будет словарем аргументов ключевого слова. Примером такого декоратора будет:161<час>Сцепление декораторов в Python
В Python можно объединить несколько декораторов.
Другими словами, функция может быть декорирована несколько раз разными (или одними и теми же) декораторами. Мы просто размещаем декораторы над нужной функцией.
174Вывод
181Приведенный выше синтаксис,
192эквивалентно
207Порядок, в котором мы цепляем декораторы, имеет значение. Если бы мы изменили порядок как,
215Результат будет таким:
224
Python
- Типы данных Python
- Операторы Python
- Оператор передачи Python
- Аргументы функции Python
- Анонимная/лямбда-функция Python
- Лямбда-функции Python с ПРИМЕРАМИ
- Функция abs() в Python:примеры абсолютных значений
- Функция Python round() с ПРИМЕРАМИ
- Функции Python range():Float, List, For loop Примеры
- Функция Python map() с ПРИМЕРАМИ