Декораторы в Python — это мощный инструмент, который позволяет изменять поведение функций или классов без изменения их исходного кода. Они широко используются для добавления новых функциональностей, таких как логирование, кеширование или проверка доступа. В этой статье мы рассмотрим, как создать и использовать декораторы в Python.
Создание декоратора
Декоратор — это функция, которая принимает другую функцию в качестве аргумента и возвращает новую функцию, обычно с измененным поведением. Вот пример простого декоратора, который выводит сообщение перед и после выполнения функции:
def simple_decorator(func): def wrapper(): print("Действие перед выполнением функции") func() print("Действие после выполнения функции") return wrapper def my_function(): print("Это моя функция") decorated_function = simple_decorator(my_function) decorated_function()
Вывод:
Действие перед выполнением функции
Это моя функция
Действие после выполнения функции
Использование декоратора с синтаксисом @
Python предоставляет специальный синтаксис для применения декораторов к функциям или классам, используя символ @
. Вот пример использования нашего декоратора с помощью этого синтаксиса:
@simple_decorator def my_function(): print("Это моя функция") my_function()
Вывод будет таким же, как и в предыдущем примере.
Декораторы с аргументами функции
Чтобы создать декоратор, который может работать с функциями, принимающими аргументы, используйте *args
и **kwargs
в определении обертывающей функции:
def decorator_with_arguments(func): def wrapper(*args, **kwargs): print("Действие перед выполнением функции") result = func(*args, **kwargs) print("Действие после выполнения функции") return result return wrapper @decorator_with_arguments def my_function_with_args(a, b): print(f"Сумма {a} и {b} равна {a + b}") my_function_with_args(1, 2)
Вывод:
Действие перед выполнением функции
Сумма 1 и 2 равна 3
Действие после выполнения функции
Использование нескольких декораторов
Вы можете применить несколько декораторов к одной функции, просто написав их один под другим:
def another_decorator(func): def wrapper(*args, **kwargs): print("Другой декоратор") return func(*args, **kwargs) return wrapper @simple_decorator @another_decorator def my_function(): print("Это моя функция") my_function()
Вывод:
Действие перед выполнением функции
Другой декоратор
Это моя функция
Действие после выполнения функции
Обратите внимание, что порядок декораторов имеет значение, и они применяются снизу вверх.
Заключение
Теперь вы знаете основы создания и использования декораторов в Python. Они могут быть очень полезными для оптимизации кода и добавления дополнительной функциональности без изменения существующих функций или классов. Не забывайте экспериментировать и создавать свои собственные декораторы! 😊
Добавить комментарий