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!
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ