Олег Марков
Создание собственных декораторов в Python
Введение
Собственные декораторы позволяют добавлять уникальное поведение функциям и методам без изменения их исходного кода. Они помогают создавать переиспользуемые компоненты, контролировать выполнение функций и внедрять дополнительные действия, такие как логирование или кэширование.
В этой статье мы разберём, как создавать собственные декораторы, использовать аргументы, правильно работать с замыканиями и избегать распространённых ошибок.
Если вы хотите детальнее изучить создание и использование декораторов, включая работу с аргументами и замыканиями — приходите на наш курс Основы Python. На курсе 209 уроков и 34 упражнения, AI-тренажеры для практики с кодом и задачами 24/7, решение задач с живым ревью наставника, еженедельные встречи с менторами.
Простейший собственный декоратор
def my_decorator(func):
def wrapper(*args, **kwargs):
print("Перед вызовом функции")
result = func(*args, **kwargs)
print("После вызова функции")
return result
return wrapper
@my_decorator
def say_hello(name):
print(f"Hello, {name}!")
say_hello("Alice")Результат:
Перед вызовом функции
Hello, Alice!
После вызова функцииДекоратор с аргументами
Для передачи аргументов в декоратор требуется вложенный уровень функций:
def repeat(times):
def decorator(func):
def wrapper(*args, **kwargs):
for _ in range(times):
func(*args, **kwargs)
return wrapper
return decorator
@repeat(3)
def greet(name):
print(f"Hello, {name}!")
greet("Bob")Вывод:
Hello, Bob!
Hello, Bob!
Hello, Bob!Декоратор с возвращаемым значением
Важно возвращать результат функции:
def add_logging(func):
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
print(f"{func.__name__} вернула {result}")
return result
return wrapper
@add_logging
def multiply(a, b):
return a * b
multiply(2, 5)
# multiply вернула 10Частые ошибки
- Не возвращать результат функции внутри wrapper.
- Не использовать
*argsи**kwargs— теряются параметры функции. - Изменять внешние переменные без
nonlocal, если требуется. - Слишком глубокая вложенность — усложняет чтение и поддержку кода.
Часто задаваемые вопросы
Можно ли декоратор использовать для методов класса? Да, и важно учитывать
selfилиclsдля методов экземпляра и класса.Можно ли декорировать декоратор? Да, декораторы можно комбинировать, применяя их один за другим через
@.Как отлаживать собственный декоратор? Используйте print, callable() и type() для проверки объекта функции и аргументов.
Заключение
Собственные декораторы — мощный инструмент для расширения функциональности функций и методов, упрощения кода и внедрения повторяющихся операций. Они применяются в логировании, кэшировании, проверке данных и тестировании.
Для системного изучения декораторов, включая создание собственных и работу с аргументами, рекомендую пройти курс Основы Python. В первых 3 модулях уже доступно бесплатное содержание — начните погружаться в мир Python прямо сегодня.
Постройте личный план изучения Python до уровня Middle — бесплатно!
Python — часть карты развития Backend
100+ шагов развития
30 бесплатных лекций
300 бонусных рублей на счет
Все гайды по Python
Лучшие курсы по теме

Основы Python
Антон Ларичев
Nest.js с нуля
Антон Ларичев