Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Python: decorator, function, wrapper, higher-order function, Python

Как декораторы изменяют поведение функции?

Вопрос проверяет понимание декораторов в Python — механизма для модификации поведения функций или классов без изменения их исходного кода.

Короткий ответ

Декоратор в Python — это функция, которая принимает другую функцию, добавляет к ней новую логику и возвращает изменённую функцию. Он позволяет расширять поведение исходной функции, не меняя её код напрямую. Например, можно добавить логирование, проверку прав доступа или замер времени выполнения. Декораторы часто используются для соблюдения принципа DRY (Don't Repeat Yourself).

Длинный ответ

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

Как работает декоратор

Синтаксически декоратор применяется с помощью символа @ перед его именем над определением функции. Это всего лишь синтаксический сахар для более простой записи. Например, запись @decorator над функцией func эквивалентна func = decorator(func).

Пример простого декоратора

Рассмотрим декоратор, который замеряет время выполнения функции:

import time

def timer_decorator(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)  # Вызов исходной функции
        end_time = time.time()
        print(f"Функция {func.__name__} выполнилась за {end_time - start_time:.4f} секунд")
        return result
    return wrapper

@timer_decorator
def calculate_sum(n):
    return sum(range(n))

# При вызове calculate_sum(1000000) будет выведено время выполнения.

Где применяются декораторы

  • Логирование: Запись информации о вызовах функций для отладки.
  • Аутентификация и авторизация: Проверка прав доступа перед выполнением функции.
  • Кэширование: Сохранение результатов дорогостоящих вычислений (например, с помощью @functools.lru_cache).
  • Валидация данных: Проверка входных аргументов функции.
  • Транзакции и управление ресурсами: Автоматическое открытие и закрытие соединений с БД.

Декораторы с аргументами

Иногда нужно передать параметры самому декоратору. В этом случае создаётся ещё один уровень вложенности — функция, возвращающая декоратор.

def repeat(times):
    """Декоратор, повторяющий вызов функции заданное количество раз."""
    def decorator(func):
        def wrapper(*args, **kwargs):
            for _ in range(times):
                result = func(*args, **kwargs)
            return result  # возвращаем результат последнего вызова
        return wrapper
    return decorator

@repeat(times=3)
def greet(name):
    print(f"Привет, {name}!")

# Вызов greet("Анна") напечатает приветствие три раза.

Вывод: Декораторы стоит применять, когда необходимо добавить сквозную функциональность (cross-cutting concern) к нескольким функциям, избегая дублирования кода. Они делают код чище, модульнее и легче для поддержки, особенно в веб-фреймворках (например, Flask, Django) и библиотеках.

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • Python

    Python

Ключевые слова

#decorator

#function

#wrapper

#higher-order function

#Python

Подпишись на Python Developer в телеграм

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.