В языке программирования Python одним из важных инструментов являются декораторы. Они позволяют изменять или расширять функциональность функций и методов без изменения их исходного кода. Декораторы часто применяются для логирования, проверки прав доступа, измерения времени выполнения и других задач, где необходимо добавить дополнительное поведение к уже существующей функции.
Что такое декоратор
Декоратор — это функция, которая принимает другую функцию в качестве аргумента и возвращает новую функцию с расширенной или изменённой функциональностью. По сути, это способ «обернуть» одну функцию другой.
Простейший пример декоратора:
def my_decorator(func):
def wrapper():
print("Before function execution")
func()
print("After function execution")
return wrapper
@my_decorator
def say_hello():
print("Hello!")
say_hello()
Результат выполнения:
Before function execution
Hello!
After function execution
Здесь @my_decorator — это синтаксический сахар, который заменяет вызов say_hello = my_decorator(say_hello).
Применение декораторов
- Логирование
Декораторы часто используют для автоматического логирования вызовов функций:
def log_decorator(func):
def wrapper(*args, **kwargs):
print(f"Calling function: {func.__name__}")
return func(*args, **kwargs)
return wrapper
@log_decorator
def add(a, b):
return a + b
print(add(5, 3))
Результат:
Calling function: add
8
2. Измерение времени выполнения функции
import time
def timer(func):
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print(f"Execution time: {end - start:.5f} seconds")
return result
return wrapper
@timer
def long_task():
time.sleep(2)
print("Task finished")
long_task()
Вывод:
Task finished
Execution time: 2.00012 seconds
3. Проверка прав доступа
Декораторы удобно использовать для проверки прав пользователя перед выполнением функции.
def check_permission(func):
def wrapper(user):
if user == "admin":
return func(user)
else:
print("Access denied")
return wrapper
@check_permission
def admin_panel(user):
print(f"Welcome, {user}!")
admin_panel("admin") # Welcome, admin!
admin_panel("guest") # Access denied
Декораторы с аргументами
Декораторы могут принимать собственные параметры. Для этого используется вложенная функция:
def repeat(times):
def decorator(func):
def wrapper(*args, **kwargs):
for _ in range(times):
func(*args, **kwargs)
return wrapper
return decorator
@repeat(3)
def greet(name):
print(f"Hello, {name}!")
greet("Alice")
Вывод:
Hello, Alice!
Hello, Alice!
Hello, Alice!
Декораторы — это мощный инструмент Python, позволяющий элегантно расширять функциональность функций и методов. Они помогают писать более чистый и удобный код, сокращают дублирование и делают программы более гибкими. Понимание и умение использовать декораторы значительно упрощает разработку и открывает новые возможности для построения эффективных решений.
0 Комментарий(я)
Зарегистрируйтесь чтобы оставить комментарий