Декораторы

Модуль 1: Python Core
8 уровень , 4 лекция
Открыта

5.1 Знакомство с декораторами

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

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

Синтаксис декораторов в Python включает использование символа @ перед именем декоратора, который размещается перед определением функции.


@decorator
def my_function():
    pass

Это эквивалентно следующему коду:


def my_function():
    pass
        
my_function = decorator(my_function)

Подумайте внимательно, что тут происходит: мы объявляем функцию my_function, но потом подменяем ее функцией decorator, куда в качестве параметра передается наша функция. Функция decorator может вызвать нашу функцию по своему выбору.

5.2 Создание простого декоратора

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


def my_decorator(func):
    def wrapper():
        print("Перед вызовом функции")
        func()
        print("После вызова функции")

    return wrapper
        
@my_decorator
def say_hello():
    print("Hello!")
        
say_hello()

Объяснение

Декоратор (my_decorator): Эта функция принимает функцию func в качестве аргумента и возвращает новую функцию wrapper, которая вызывает func и добавляет дополнительное поведение до и после ее вызова.

Функция с декоратором (say_hello): Функция say_hello обернута декоратором my_decorator, что добавляет дополнительное поведение при ее вызове.

Вывод:


# Перед вызовом функции
Hello!
# После вызова функции

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

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


def repeat(num_times):
    def decorator_repeat(func):
        def wrapper(*args, **kwargs):
            for _ in range(num_times):
                func(*args, **kwargs)

        return wrapper
        
    return decorator_repeat
        
@repeat(num_times=3)
def say_hello(name):
    print(f"Hello, {name}!")
        
say_hello("Alice")

Объяснение

Декоратор с аргументами (repeat): Эта функция принимает аргумент num_times и возвращает декоратор decorator_repeat.

Декоратор (decorator_repeat): Этот декоратор принимает функцию func и возвращает новую функцию wrapper, которая вызывает func num_times раз.

Функция с декоратором (say_hello): Функция say_hello вызывается трижды благодаря декоратору repeat.

Вывод:


Hello, Alice!
Hello, Alice!
Hello, Alice!
2
Задача
Модуль 1: Python Core, 8 уровень, 4 лекция
Недоступна
Декоратор.
Декоратор.
2
Задача
Модуль 1: Python Core, 8 уровень, 4 лекция
Недоступна
Многократый декоратор.
Многократый декоратор.
Комментарии (24)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Owen Уровень 14
3 марта 2026
Не, ну это уже не смешно. Объяснение непонятное, решение задач это тупо копипаст кода с лекции. И за что тут 30 баксов в месяц???? Приходится все переспрашивать у ИИ, он и то более понятней объясняет тему.
Andrey Уровень 22
17 января 2026
Вобще такую достаточно сложную и новую для многих тему можно было бы расписать и поподробнее. Откоровенная халтура, простите за откровенность. И боже какое счастье что сейчас появились нейронки, которые могут пошагово расписать как работает непонятный код.
Светлана Уровень 24
9 января 2026
кажется, я поняла в чем тут дело... правда три раза прочитать пришлось и про замыкания еще 2 раза повторить, и задачки написать не подглядывая 🙂
Семён Чурашев Уровень 14
5 января 2026
Просто дно, спросил чатик deepseek про func все тоже самое
AlterAyrol Уровень 25
20 октября 2025
в принципе, если знать это и работать с этим, то для повторения норм. А вот изучать в таком виде...) уж лучше взять Java, там всё было понятнее изложено. P.S. знаю Python и взял курс по скидке для повторения основ. Так же прошёл занятий 10 по Java на этом же сайте. Сравнение не в польз Python.
shinobi Уровень 20
28 июля 2025
О качестве подаваемого материала свидетельствуют комментаторы, каждый второй из которых понял суть только с помощью чатГПТ, так зачем мы отдаем деньги автору, если чатгпт бесплатный?
Slevin Уровень 57
1 июля 2025
Если кому-то не очень понятно как именно работает код - копируйте его в ChatGPT и просите объяснить. Вы можете углубляться вопросами до бесконечности, пока не станет все кристально понятно. Пользуйтесь. Программисту так или иначе приходится всю жизнь учиться и всегда находиться в поиске понимания/объяснения
Евгений Уровень 14
20 июня 2025
Пару лет назад я проходил курс здесь по Java (так к сожалению и не прошел до конца) и там действительно подача материала была интересной, а тут будто даже не старались над курсом, просто копировать - вставить это просто ужас какой-то, даже подумать не дают пару минут, по мне лучше уж тогда бесплатные курсы на Stepik пройти, там хоть задачи интересные и заставляют изрядно подумать над решением от нескольких минут до нескольких дней в зависимости от сложности, при этом не стоит этот курс 99 долларов, даже если в год, Java да, интересно проходить, там хоть думать надо, но по Python будто для галочки добавили, чтобы больше людей привлечь к платформе, на счет HTML и SQL я даже боюсь представить, если подача такая же как и в Python, лучше уж тогда проходить на этой платформе только Java, что следует из названия платформы и развивать дальше курс чисто по Java, как и было раньше, например, добавить побольше интересных задач.
shinobi Уровень 20
28 июля 2025
Подписываюсь. Год назад проходил джава, брал на год, дошёл уровня наверное до 30, но потом появилось куча дел и не было времени на обучение и хобби. Сейчас время появилось, решил попробовать снова но уже с питона, беру подписку на год иии..... Разочаровываюсь... Джава курс будто с душой писался, и задачи интересные, и объяснения нормальные, и комикс-картинки вот эти вставлены добавляли прикола своего и шарма, а тут будто сделали на скорую руку особо не старясь лишь бы срубить деньги на "былом имени", ну именно так и получилось, я не первый и не последний кто из за джавы купил питон, и именно после джавы этот курс питона еще больнее воспринимать. Что там в других курсах - даже проверять не стану.
Виталий Уровень 33
2 мая 2025
Пошаговое объяснение работы: 1. Фабрика декораторов (`repeat(num_times)`): - Принимает параметр `num_times` (сколько раз повторять) - Возвращает декоратор `decorator_repeat` 2. Декоратор (`decorator_repeat(func)`): - Принимает целевую функцию (`func`) - Возвращает функцию-обертку (`wrapper`) 3. Функция-обертка (`wrapper(*args, **kwargs)`): - Принимает любые аргументы (`*args, **kwargs`) - В цикле вызывает оригинальную функцию `num_times` раз 4. Применение декоратора: - `@repeat(num_times=3)` применяет декоратор с параметром 3 - Фактически делает: `say_hello = repeat(3)(say_hello)` 5. Вызов функции: - При вызове `say_hello("Alice")` выполняется `wrapper("Alice")` - Который 3 раза вызывает оригинальную `say_hello` Результат выполнения: ``` Hello, Alice! Hello, Alice! Hello, Alice! ``` Ключевые особенности: 1. Декоратор с параметрами требует трехуровневую структуру: - Внешняя функция принимает параметры декоратора - Средняя функция принимает декорируемую функцию - Внутренняя функция (wrapper) реализует логику 2. Аргументы функции правильно передаются через `*args, **kwargs` 3. Гибкость - можно указать разное количество повторений для разных функций Такой подход часто используется для: - Повторного выполнения функций при ошибках - Тестирования производительности - Логирования вызовов функций
SWK Уровень 26
2 апреля 2025
2е задание:

Программа должна определить декоратор repeat(num_times), который 
принимает количество повторов в качестве аргумента.
Определение из лекции:

Декораторы — это функции, которые принимают другую функцию в качестве 
аргумента и возвращают новую функцию, изменяя или расширяя поведение 
исходной функции.
Меня терзают смутные сомненья относительно того, может ли декоратор одновременно принимать "количество повторов" и "другую функцию". Ладно, учитывая динамическую типизацию пайтона, готов поставить вопрос так: может ли "количество повторов" одновременно являться "другой функцией". Сдаётся мне, авторы раздела не могут объяснить потому, что сами не очень понимают. Как минимум, нужно пояснить, как в последнем примере через repeat в decorator_repeat просачивается информация о том, какую именно функцию func нужно вызывать.