Декораторы в Python — это мощный инструмент для расширения функциональности функций и методов без изменения их кода. В этой статье мы разберемся, как создать и использовать декораторы в Python.
Что такое декораторы
Декораторы — это функции, которые принимают другую функцию в качестве аргумента и возвращают новую функцию, обычно с дополнительной функциональностью. В Python декораторы применяются с помощью символа @
перед объявлением функции или метода.
Простой пример декоратора
Давайте создадим простой декоратор, который будет выводить информацию о вызове функции:
def simple_decorator(func): def wrapper(): print(f"Function {func.__name__} is called") return func() return wrapper @simple_decorator def my_function(): print("Hello, world!") my_function()
Вывод:
Function my_function is called
Hello, world!
Здесь мы создали декоратор simple_decorator
, который принимает функцию func
и возвращает новую функцию wrapper
. Внутри wrapper
мы выводим информацию о вызове функции и затем вызываем саму функцию func
.
Декораторы с аргументами
Чтобы создать декоратор, который может принимать аргументы, мы должны добавить еще одну обертку вокруг нашего декоратора:
def decorator_with_args(arg1, arg2): def actual_decorator(func): def wrapper(): print(f"Function {func.__name__} is called with arguments {arg1} and {arg2}") return func(arg1, arg2) return wrapper return actual_decorator @decorator_with_args("Hello", "world!") def my_function_with_args(arg1, arg2): print(f"{arg1}, {arg2}") my_function_with_args()
Вывод:
Function my_function_with_args is called with arguments Hello and world!
Hello, world!
Теперь наш декоратор принимает аргументы и мы можем использовать их внутри wrapper
.
Использование functools.wraps
При использовании декораторов важно сохранить метаданные исходной функции, такие как имя, документация и т.д. Для этого в Python есть специальный декоратор functools.wraps
, который копирует эти метаданные:
import functools def simple_decorator(func): @functools.wraps(func) def wrapper(): print(f"Function {func.__name__} is called") return func() return wrapper @simple_decorator def my_function(): """This is a simple function""" print("Hello, world!") print(my_function.__name__) print(my_function.__doc__)
Вывод:
my_function
This is a simple function
Теперь наш декоратор корректно сохраняет метаданные исходной функции.
Заключение
В этой статье мы разобрали основы создания и использования декораторов в Python. Теперь вы можете применять этот мощный инструмент для расширения функциональности функций и методов в своих проектах. Удачного кодинга! 😊
Добавить комментарий