Декораторы в Python: руководство для начинающих

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

Создание декоратора

Декоратор — это функция, которая принимает другую функцию в качестве аргумента и возвращает модифицированную версию этой функции.

Пример создания простого декоратора:

def decorator(func):
    def wrapper():
        print("Код до выполнения функции")
        func()
        print("Код после выполнения функции")
    return wrapper

decorator — функция-декоратор. Она принимает функцию func и возвращает новую функцию wrapper. wrapper выполняет код до и после вызова func.

Использование декоратора

Создадим функцию show:

def show():
    print("Я обычная функция")

Задекорируем show с помощью decorator:

decorated = decorator(show)
decorated()

Функция show передаётся в decorator, возвращается модифицированная функция, и она вызывается. Результат:

Код до выполнения функции
Я обычная функция
Код после выполнения функции

Синтаксический сахар: @декоратор

Более удобный способ — синтаксический сахар @:

@decorator
def show():
    print("Я обычная функция")

show()

Этот код эквивалентен предыдущему.

Декораторы с аргументами

В декораторах может потребоваться передача аргументов в декорируемую функцию. Необходимо изменить структуру декоратора:

def decorator(func):
    def wrapper(*args, **kwargs):
        print("Код до выполнения функции")
        result = func(*args, **kwargs)
        print("Код после выполнения функции")
        return result
    return wrapper

@decorator
def show(line):
    print(line)

show("Я обычная функция")

decorator принимает произвольное количество позиционных (*args) и именованных (**kwargs) аргументов, которые передаются декорируемой функции.

Несколько декораторов

К функции можно применять несколько декораторов:

def decorator_1(func):
    # ...

def decorator_2(func):
    # ...

@decorator_1
@decorator_2
def show():
    print("Я обычная функция")

Декораторы применяются сверху вниз: сначала decorator_2, затем decorator_1, и потом show.

Порядок выполнения декораторов

Пример с двумя декораторами:

def test_1(func):
    def wrapper():
        print("Код выполнения функции 1")
        func()
        print("Код выполнения функции 1 (конец)")
    return wrapper

def test_2(func):
    def wrapper():
        print("Код выполнения функции 2")
        func()
        print("Код выполнения функции 2 (конец)")
    return wrapper

@test_1
@test_2
def show():
    print("Я обычная функция")

show()

Сначала выполнится test_2, затем test_1, и наконец, show.

Декораторы — мощный инструмент в Python для расширения функциональности функций без изменения их кода. Важно помнить о потенциальном снижении производительности и применять их разумно. Правильное понимание их работы позволит эффективно использовать их в программах.

Что будем искать? Например,программа