Декораторы

Модуль 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 лекция
Недоступна
Многократый декоратор.
Многократый декоратор.
Комментарии (28)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
kasnil Уровень 66
30 августа 2026
Базовый декоратор - 2 уровня def Декоратор с аргументами - 3 уровня def Python понимает, какой перед ним декоратор по наличию ()
Кэрривайт Уровень 7
18 мая 2026
Проще говоря, декоратор — это «обёртка» вокруг функции, которая позволяет: выполнять код до вызова функции; выполнять код после вызова функции; модифицировать аргументы функции; модифицировать возвращаемое значение; полностью заменить поведение функции.
EvgenyXIV Уровень 31
31 марта 2026
Привет всем недовольным этим курсом! Подробная критика свидетельствует о внимательном прочтении (пусть и без понимания))! Это уже конкретная польза перед встречей с настоящей халтурой в будущем...)
Owen Уровень 14
3 марта 2026
Не, ну это уже не смешно. Объяснение непонятное, решение задач это тупо копипаст кода с лекции. И за что тут 30 баксов в месяц???? Приходится все переспрашивать у ИИ, он и то более понятней объясняет тему.
Andrey Уровень 32
17 января 2026
Вобще такую достаточно сложную и новую для многих тему можно было бы расписать и поподробнее. Откоровенная халтура, простите за откровенность. И боже какое счастье что сейчас появились нейронки, которые могут пошагово расписать как работает непонятный код.
Светлана Уровень 25
9 января 2026
кажется, я поняла в чем тут дело... правда три раза прочитать пришлось и про замыкания еще 2 раза повторить, и задачки написать не подглядывая 🙂
Семён Чурашев Уровень 14
5 января 2026
Просто дно, спросил чатик deepseek про func все тоже самое
AlterAyrol Уровень 25
20 октября 2025
в принципе, если знать это и работать с этим, то для повторения норм. А вот изучать в таком виде...) уж лучше взять Java, там всё было понятнее изложено. P.S. знаю Python и взял курс по скидке для повторения основ. Так же прошёл занятий 10 по Java на этом же сайте. Сравнение не в польз Python.
Александр Уровень 15
20 августа 2026
Курс по Java - это вообще шедевр, настолько изящно описан: с хитростями, с юмором, с глубоким погружением в каждую тему. Даже удивительно, что такое можно было создать. Думал курс по Python будет такой же интересный. Не могу сказать, что совсем мусор, угадывается подход из курса по Java, если язык не первый наверное норм. Посмотрим, что будет дальше.
shinobi Уровень 20
28 июля 2025
О качестве подаваемого материала свидетельствуют комментаторы, каждый второй из которых понял суть только с помощью чатГПТ, так зачем мы отдаем деньги автору, если чатгпт бесплатный?
Slevin Уровень 59
1 июля 2025
Если кому-то не очень понятно как именно работает код - копируйте его в ChatGPT и просите объяснить. Вы можете углубляться вопросами до бесконечности, пока не станет все кристально понятно. Пользуйтесь. Программисту так или иначе приходится всю жизнь учиться и всегда находиться в поиске понимания/объяснения