Python - весьма функционально насыщенный язык. Он обладает множеством встроенных возможностей, которые облегчают написание читабельного и эффективного кода. В этой статье мы рассмотрим одну из таких них, называемую декораторами.
Декораторы - это функции, которые используются для изменения поведения других функций. Это очень мощная конструкция, поскольку она позволяет изменить поведение функции без необходимости переписывать её. Другими словами, вы можете добавить дополнительный функционал в функцию, не изменяя ее.
Например, если вы хотите логировать все вызовы функции, вы можете сделать это следующим образом:
Здесь в строке 5 мы создаем декоратор.
В строке 6 мы определяем функцию-обертку.
В строке 9 мы возвращаем результат запуска оригинальной функции.
В строке 10 мы возвращаем функцию-обертку. Это функция, которая будет использоваться для декорирования исходной функции.
С технической точки зрения, декораторы оборачивают функцию. Так, функция, которая декорируется, называется обернутой функцией (wrapped function), а функция, которая ее декорирует, называется функцией-декоратором (decorator function). Так, декоратор log_function - это функция, которая принимает другую функцию в качестве аргумента и возвращает новую функцию, которая обертывает исходную, добавляет ей необходимый нам функционал.
Эта новая функция называется функцией-оберткой, и именно она вызывается при вызове декорированной функции.
Посмотрим на примере
И вот то, что мы видим при запуске программы
Наш декоратор обернул функцию, написал её имя, и вернул результат вызова функции.
Теперь, для более практичного примера, давайте создадим декоратор, который будет печатать имя вызываемой функции и аргументы, которые ей передаются. Это полезно для отладки.
И вот, что мы видим при запуске
В заключение
В этой статье вы узнали о декораторах Python. Декораторы - это простой, но мощный способ расширить функциональность уже существующих классов и функций. Вы также узнали о том, как работают декораторы и как писать свои собственные декораторы.
И напоследок, я приглашаю вас подписаться на мой блог, и благодарю вас за прочтение этой статьи. Спасибо!