Skip to content

Декораторы

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

def decor(func):
    def wrap():
        print('============')
        func()
        print('============')
    return wrap
def print_text():
    print('Hello World!')
decorated = decor(print_text)
decorated()

Мы определили функцию с именем decor, у которой один единственный параметр func. Внутри функции decor, мы определили вложенную функцию с именем wrap. Функция wrap выведет строку, затем вызовет func() и выведет еще одну строку. Функция decor возвращает функцию wrap как свой результат.

Можно сказать, что переменная decorated - декорированная версия print_text, то есть print_text плюс что-то еще.
Предположим, мы написали полезный декоратор и хотели бы полностью заменить print_text декорированной версией, так чтобы всегда выполнялась наша версия print_text «плюс что-то еще».

Это делается путем повторного присвоения переменной, содержащей нашу функцию:

print_text = decor(print_text)
print_text()

Теперь print_text привязана к нашей декорированной версии.

В предыдущем примере, мы декорировали нашу функцию, заменив переменную, содержащую функцию, на ее «обернутую» версию.

Эта конструкция может быть использована в любой момент для оборачивания любой нужной функции. Python предоставляет способ обернуть функцию в декоратор; для этого нужно поставить перед определением функции имя декоратора и символ @. Если определяется функция, мы можем «декорировать» ее, добавив символ @; вот как:

@decor
def print_text():
    print('Hello World!')

Результат будет тот же, что и в примере выше.

Функция может иметь несколько декораторов.

Back to top