Декоратори

Модуль 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!
Коментарі (5)
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ
Oberon Рівень 22
28 серпня 2025
... реально все з чату GPT... один до одного, фу блін Колись робив курс JavaRush по Джаві — це був дійсно непоганий курс з поясненнями, з відсилками на документацію, на статті для самостійного розбору. А найголовніше — там тебе завалювали практичними завданнями різного рівня. (light, medium, hard, hard*) Над деякими справді потрібно було думати і шукати матеріал в інтернеті. А тут — після кожної теми два завдання рівня ніби "medium" ... таке собі.
9 січня 2025
Жесть.... Або дуже складна тема, або пояснення так собі.... Не зрозумів, чому повинно вивестісь

# Перед викликом функції
Hello!
# Після виклику функції
якщо по логікі та факту виводиться

Перед викликом функції
Hello!
Після виклику функції
Andriy Trubchanin Рівень 23
16 лютого 2025
Бо не повинно. Ніякої решітки там не буде.
Semen Рівень 21
2 липня 2025
Насправді, як видно з прикладами до лекцій не дуже заморочувались, оскільки всі приклади декораторів, це саме ті, які видає chatGPT при поясненні терміну "декоратор"... )))
Валерий Рівень 18
15 листопада 2024
Функція wrapper() у контексті декораторів в Python — це поширена практика, але її використання не є обов’язковим. Зазвичай вона використовується як внутрішня функція в декораторі, щоб обгорнути функцію, яка декорується, і додати до неї додаткову логіку.