82 Глава 3 •
Эффективные функции
класса в Python. В этой книге им посвящен целый раздел, и я рекомен-
дую вам потратить несколько минут, чтобы его просмотреть. Самыми
важными для понимания декораторов выводами относительно «функций
первого класса» являются следующие:
функции являются объектами — их можно присваивать переменным,
передавать в другие функции
и возвращать из других функций;
функции могут быть определены внутри других функций — и дочер-
няя функция может захватывать локальное состояние родительской
функции (лексические замыкания).
Готовы? Отлично! Тогда приступим.
Основы
декораторов Python
Итак, что же такое декораторы на самом деле? Они «украшают», или
«обер тывают», другую функцию и позволяют исполнять программный
код до
и после того, как обернутая функция выполнится.
Декораторы позволяют определять конструктивные блоки многократного
использования, которые могут изменять или расширять поведение других
функций. И они позволяют это делать без необратимых изменений самой
обернутой функции. Поведение функции изменяется, только когда оно
декорировано.
Как могла бы выглядеть реализация простого декоратора? В общих чертах
декоратор — это вызываемый объект, который на входе принимает один
вызываемый объект, а на выходе возвращает другой вызываемый объект.
Приведенная ниже функция имеет это свойство и может считаться самым
простым декоратором, который вы могли когда-либо написать:
def null_decorator(func):
return func
Как вы видите,
null_decorator
является вызываемым объектом (это
функция). На входе он принимает еще один вызываемый объект и на
выходе возвращает тот же самый вызываемый объект без его изменения.
3 .3 . Сила декораторов
83
Давайте его применим, чтобы декорировать (или
обернуть) еще одну
функцию:
def greet():
return 'Привет!'
greet = null_decorator(greet)
>>> greet()
'Привет!'
В этом примере я определил функцию
greet
и сразу же ее декорировал,
пропустив через функцию
null_decorator
. Понимаю, пока это все вы-
глядит бесполезным. Я ведь о том, что мы намеренно спроектировали
пустой декоратор бесполезным, верно? Но через мгновение этот пример
разъяснит, как работает специальный синтаксис Python, предназначенный
для декораторов.
Вместо того чтобы явным образом вызывать
null_decorator
с функцией
greet
и затем по-новому присваивать его переменной, удобнее восполь-
зоваться
синтаксисом Python
@
для декорирования функции:
@null_decorator
def greet():
return 'Привет!'
>>> greet()
'Привет!'
Размещение строки
@null_decorator
перед определением функции анало-
гично тому, что функция сначала определяется и затем уже прогоняется
через декоратор. Синтаксис
@
является всего лишь
синтаксическим саха-
Do'stlaringiz bilan baham: