🔍 Введение
Если вы писали на Python больше недели, вы наверняка видели символ @
над функцией — это декоратор. Он может показаться магией, но на деле — мощный и понятный инструмент.
Декораторы в Python позволяют "оборачивать" одну функцию в другую, изменяя или расширяя её поведение без изменения исходного кода. Они используются повсеместно: в Flask, Django, FastAPI, pytest, и даже в стандартной библиотеке.
В этой статье мы глубоко разберем:
-
Что такое декораторы в Python;
-
Как они устроены;
-
Как писать свои;
-
Где и зачем их использовать.
💡 Что такое декоратор в Python?
Декоратор — это функция, которая принимает другую функцию и возвращает новую функцию (или модифицированную старую).
Простой пример:
📌 Вывод:
@decorator
— это просто синтаксический сахар для:
⚙️ Как это работает внутри
Чтобы понять декораторы, нужно знать:
-
В Python функции — объекты.
-
Можно передавать функции как аргументы.
-
Можно определять функции внутри других.
Это и называется замыканием (closure).
Минимальный шаблон декоратора:
📦 Примеры декораторов
Декоратор времени выполнения:
Декоратор авторизации:
Декоратор с аргументами (фабрика декораторов)
🧪 Встроенные декораторы в Python
Декоратор | Назначение |
---|---|
@staticmethod |
Создаёт статический метод класса |
@classmethod |
Метод, принимающий класс как cls |
@property |
Превращает метод в атрибут |
@functools.lru_cache |
Кэширует результат функции |
🔄 functools.wraps
Чтобы не терялись __name__
, __doc__
, __module__
, нужно использовать functools.wraps
:
Без этого say_hello.__name__
будет wrapper
, а не say_hello
.
📚 Примеры из практики
Django
Flask
pytest
🛠️ Использование нескольких декораторов
Эквивалент:
🧠 Best practices
-
Используйте
@wraps
всегда. -
Не создавайте вложенные декораторы без надобности.
-
Не злоупотребляйте декораторами с побочными эффектами.
-
Помните: декораторы применяются при импорте, не при вызове.
⚠️ Частые ошибки
Ошибка | Как избежать |
---|---|
Неиспользование @wraps |
Добавить @wraps над wrapper() |
Потеря аргументов | Использовать *args, **kwargs |
Декоратор с аргументами не работает | Обернуть в фабрику: @repeat(3) |
🧾 Заключение
Декораторы в Python — мощный инструмент, позволяющий расширять поведение функций без изменения их кода. Они применяются повсеместно — в веб-разработке, тестировании, логировании, безопасности, кэшировании и многом другом.
Их сила — в чистоте и гибкости: однажды написав правильный декоратор, вы можете применять его к десяткам функций, не дублируя логику.
❓FAQ
В: Что такое декоратор в Python?
О: Это функция, которая оборачивает другую функцию, расширяя или изменяя её поведение.
В: Как работает @
?
О: Это синтаксический сахар для func = decorator(func)
.
В: Можно ли передавать аргументы декоратору?
О: Да, через фабрику: @decorator(arg)
.
В: Что делает @wraps
?
О: Сохраняет имя и документацию оригинальной функции.
В: Декораторы — это функциональное программирование?
О: Да, это часть функционального стиля в Python.