Декораторы в 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 для расширения функциональности функций без изменения их кода. Важно помнить о потенциальном снижении производительности и применять их разумно. Правильное понимание их работы позволит эффективно использовать их в программах.