Декораторы

Модуль 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 лекция
Недоступна
Многократый декоратор.
Многократый декоратор.
Комментарии (20)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
AlterAyrol Уровень 25
20 октября 2025
в принципе, если знать это и работать с этим, то для повторения норм. А вот изучать в таком виде...) уж лучше взять Java, там всё было понятнее изложено. P.S. знаю Python и взял курс по скидке для повторения основ. Так же прошёл занятий 10 по Java на этом же сайте. Сравнение не в польз Python.
shinobi Уровень 19
28 июля 2025
О качестве подаваемого материала свидетельствуют комментаторы, каждый второй из которых понял суть только с помощью чатГПТ, так зачем мы отдаем деньги автору, если чатгпт бесплатный?
Slevin Уровень 64
1 июля 2025
Если кому-то не очень понятно как именно работает код - копируйте его в ChatGPT и просите объяснить. Вы можете углубляться вопросами до бесконечности, пока не станет все кристально понятно. Пользуйтесь. Программисту так или иначе приходится всю жизнь учиться и всегда находиться в поиске понимания/объяснения
Евгений Уровень 14
20 июня 2025
Пару лет назад я проходил курс здесь по Java (так к сожалению и не прошел до конца) и там действительно подача материала была интересной, а тут будто даже не старались над курсом, просто копировать - вставить это просто ужас какой-то, даже подумать не дают пару минут, по мне лучше уж тогда бесплатные курсы на Stepik пройти, там хоть задачи интересные и заставляют изрядно подумать над решением от нескольких минут до нескольких дней в зависимости от сложности, при этом не стоит этот курс 99 долларов, даже если в год, Java да, интересно проходить, там хоть думать надо, но по Python будто для галочки добавили, чтобы больше людей привлечь к платформе, на счет HTML и SQL я даже боюсь представить, если подача такая же как и в Python, лучше уж тогда проходить на этой платформе только Java, что следует из названия платформы и развивать дальше курс чисто по Java, как и было раньше, например, добавить побольше интересных задач.
shinobi Уровень 19
28 июля 2025
Подписываюсь. Год назад проходил джава, брал на год, дошёл уровня наверное до 30, но потом появилось куча дел и не было времени на обучение и хобби. Сейчас время появилось, решил попробовать снова но уже с питона, беру подписку на год иии..... Разочаровываюсь... Джава курс будто с душой писался, и задачи интересные, и объяснения нормальные, и комикс-картинки вот эти вставлены добавляли прикола своего и шарма, а тут будто сделали на скорую руку особо не старясь лишь бы срубить деньги на "былом имени", ну именно так и получилось, я не первый и не последний кто из за джавы купил питон, и именно после джавы этот курс питона еще больнее воспринимать. Что там в других курсах - даже проверять не стану.
Виталий Уровень 31
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 нужно вызывать.
Mr.Robot Уровень 21 Expert
4 марта 2025
Последний кейс, отмеченный пунктом 5.3 наглядно иллюстрирует совместное применение декораторов и замыканий, если кто не разобрался. Глубокоуважаемый ChatGPT разжевал этот пример очень ясно и подробно. Внешнюю функцию в этом случае неправильно называть декоратором, а скорее это - фабрика, генерирующая декоратор. И да - тут все сошлось воедино: замыкания о которых говорили ранее и декораторы этой темы. Думаю, что авторам следовало бы дать какой-нибудь намек на это в тексте. А так совершенно непонятно к чему этот трехэтажный наворот только, чтобы 3 раза поприветствовать Алису.
SWK Уровень 26
2 апреля 2025
Вывод: похоже, примеры таки являют собой осмысленную систему, но авторы её не секут. Т.е., примеры авторы откуда-то скоммуниздили, но грамотно объяснить не могут. По ведению: жаль, что мы так и не увидели выступления товарища ЖПТ, разжёвывающее всё ясно и подробно.
Anonymous #3563789 Уровень 21
26 апреля 2025
конечно скомуниздили, откуда-то из англоязычных источников, а описания перевели на русский, а тест кейсы так и остались на английском. Иначе как обьяснить, что в задании написано "создайте множество с ключом "имя"" а тест кейс требует ключа "name"
KCat369 Уровень 14
10 февраля 2025
Подумайте внимательно ...
Денис Уровень 33
30 декабря 2024
Любопытный аналог проксей, но конечно обязательная вложенность функций читаемость убивает начисто.
Виктор Уровень 25
21 декабря 2024
Очень сложно, прям заставлеят искать информацию в других источниках