Декораторы Python: функции переноса и изменения

Изучите декораторы Python для динамического изменения поведения функций. Понимать функции-оболочки, синтаксис @ и обработку аргументов в декораторах.

Попробуйте в редакторе

Обзор

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

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

Чтобы сделать применение декораторов простым и понятным, Python предоставляет синтаксический сахар `@decorator_name`, размещаемый непосредственно над определением целевой функции. При вызове декорированной функции Python вместо этого вызывает оболочку. Если функция принимает параметры, оболочка должна принимать произвольные аргументы (`*args` и `**kwargs`) и правильно их пересылать. Понимание декораторов позволяет вам писать высокомодульный, чистый и СУХОЙ (не повторяйте себя) код.

Код и вывод выполнения

Пользовательский декоратор, который отслеживает и регистрирует детали выполнения функций.

def call_tracker(func):
    """Decorator that tracks and logs function execution details."""
    def wrapper(*args, **kwargs):
        print(f"Calling {func.__name__} with args: {args}")
        result = func(*args, **kwargs)
        print(f"{func.__name__} returned: {result}")
        return result
    return wrapper

@call_tracker
def multiply(a, b):
    return a * b

# Calling the decorated function
result = multiply(5, 4)
Терминальный выход
Calling multiply with args: (5, 4)
multiply returned: 20

Пошаговая реализация

  • Регистрация показателей времени выполнения в мониторах производительности.
  • Обеспечение проверки подлинности и авторизации на маршрутах
  • Кэширование или запоминание дорогостоящих результатов вычислений

Часто задаваемые вопросы

Как декораторы обрабатывают аргументы?

Используя *args и **kwargs во вложенной функции-оболочке, что позволяет ей получать и пересылать любые позиционные или ключевые параметры в обернутую функцию.

Можете ли вы применить несколько декораторов к одной функции?

Да, вы можете складывать их. Они будут выполняться сверху вниз (от самого внутреннего к самому внешнему).

Связанные темы

Рекомендуемые ресурсы Python

Расширьте свои знания с помощью соответствующих интерактивных руководств, шпаргалок и сравнений кода.