Декоратори

Відкрита

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 лекція
Недоступна
Багаторазовий декоратор.
Багаторазовий декоратор.
Коментарі (6)
  • популярні
  • нові
  • старі
Щоб залишити коментар, потрібно ввійти в систему
Oberon
Рівень 22
28 серпня 2025, 15:48
... реально все з чату GPT... один до одного, фу блін Колись робив курс JavaRush по Джаві — це був дійсно непоганий курс з поясненнями, з відсилками на документацію, на статті для самостійного розбору. А найголовніше — там тебе завалювали практичними завданнями різного рівня. (light, medium, hard, hard*) Над деякими справді потрібно було думати і шукати матеріал в інтернеті. А тут — після кожної теми два завдання рівня ніби "medium" ... таке собі.
9 січня 2025, 08:54
Жесть.... Або дуже складна тема, або пояснення так собі.... Не зрозумів, чому повинно вивестісь
# Перед викликом функції
Hello!
# Після виклику функції
якщо по логікі та факту виводиться
Перед викликом функції
Hello!
Після виклику функції
Andriy Trubchanin
Рівень 23
16 лютого 2025, 13:54
Бо не повинно. Ніякої решітки там не буде.
Semen
Рівень 21
2 липня 2025, 12:59
Насправді, як видно з прикладами до лекцій не дуже заморочувались, оскільки всі приклади декораторів, це саме ті, які видає chatGPT при поясненні терміну "декоратор"... )))
Дмитро
Рівень 56
18 січня, 20:03
64 рівень 👀
Валерий
Рівень 18
15 листопада 2024, 14:18
Функція wrapper() у контексті декораторів в Python — це поширена практика, але її використання не є обов’язковим. Зазвичай вона використовується як внутрішня функція в декораторі, щоб обгорнути функцію, яка декорується, і додати до неї додаткову логіку.