Что такое декоратор в Python?

Декоратор в Python - это функция, которая принимает другую функцию в качестве аргумента, добавляет к ней некоторую функциональность и возвращает измененную функцию. Обычно используется для повторного использования кода и модификации поведения функций или методов без изменения их исходного кода. Пример:

@my_decorator
def my_function():
    pass
    
Эквивалентно:

def my_function():
    pass
my_function = my_decorator(my_function)
    

В Python декоратор – это мощный и элегантный способ модифицировать или расширить функциональность функций или методов, не изменяя их исходный код.

По сути, декоратор - это функция, которая принимает другую функцию в качестве аргумента, добавляет некоторую новую функциональность, и возвращает модифицированную функцию. Это реализуется с использованием синтаксиса @.

Ключевые концепции:

  • Функция первого класса: В Python функции являются объектами первого класса, то есть их можно передавать в качестве аргументов другим функциям, возвращать из функций и присваивать переменным.
  • Замыкание (Closure): Декоратор часто использует замыкание, когда внутренняя функция имеет доступ к переменным внешней функции (декоратора), даже после того, как внешняя функция завершилась.

Пример:

    
def my_decorator(func):
    def wrapper():
        print("Что-то происходит перед вызовом функции.")
        func()
        print("Что-то происходит после вызова функции.")
    return wrapper

@my_decorator
def say_hello():
    print("Привет!")

say_hello()
    
  

Вывод:

    
Что-то происходит перед вызовом функции.
Привет!
Что-то происходит после вызова функции.
    
  

Объяснение:

  • my_decorator – это функция-декоратор. Она принимает функцию func в качестве аргумента.
  • wrapper – это внутренняя функция, которая содержит код, который будет выполняться до и после вызова декорируемой функции.
  • Строка @my_decorator над функцией say_hello эквивалентна записи say_hello = my_decorator(say_hello). То есть, функция say_hello передается в my_decorator, а возвращенное значение (функция wrapper) присваивается переменной say_hello.

Зачем использовать декораторы:

  • Повторное использование кода: Декораторы позволяют повторно использовать код для добавления функциональности к нескольким функциям без необходимости дублирования кода.
  • Читаемость кода: Декораторы делают код более чистым и читаемым, отделяя дополнительную функциональность от основной логики функции.
  • Удобство обслуживания: Изменения в декораторе автоматически применяются ко всем функциям, которые он декорирует, что облегчает обслуживание и внесение изменений.

Примеры использования:

  • Логирование вызовов функций
  • Хронометраж времени выполнения функций
  • Проверка прав доступа
  • Кэширование результатов функций

В заключение, декораторы – это мощный инструмент в Python, который позволяет улучшить читаемость, расширяемость и поддерживаемость кода. Понимание их принципов работы и вариантов использования является важным навыком для Python-разработчика.

0