Основы декораторов
Что такое декораторы?
Декораторы - это мощная особенность Python, которая позволяет модифицировать или расширять функции и методы без прямого изменения их исходного кода. Они предоставляют чистый и повторно используемый способ расширения функциональности.
Базовая структура декоратора
def my_decorator(func):
def wrapper(*args, **kwargs):
## Code before function execution
result = func(*args, **kwargs)
## Code after function execution
return result
return wrapper
@my_decorator
def example_function():
pass
Визуализация работы декоратора
graph TD
A[Original Function] --> B[Decorator Wrapper]
B --> C{Pre-processing}
C --> D[Original Function Call]
D --> E{Post-processing}
E --> F[Return Result]
Типы декораторов
Тип декоратора |
Описание |
Пример использования |
Функциональные декораторы |
Модифицируют поведение функции |
Логирование, измерение времени, аутентификация |
Классовые декораторы |
Модифицируют поведение класса |
Паттерн одиночки (Singleton pattern), кэширование |
Методные декораторы |
Улучшают функциональность метода |
Валидация, контроль доступа |
Продвинутые техники декораторов
Параметризованные декораторы
def repeat(times):
def decorator(func):
def wrapper(*args, **kwargs):
for _ in range(times):
result = func(*args, **kwargs)
return result
return wrapper
return decorator
@repeat(times=3)
def greet(name):
print(f"Hello, {name}!")
Сохранение метаданных
import functools
def my_decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
"""Wrapper function documentation"""
return func(*args, **kwargs)
return wrapper
Декораторы, специфичные для корутин
Декораторы могут быть особенно мощными в сочетании с корутинами:
import asyncio
import time
def timer_decorator(func):
async def wrapper(*args, **kwargs):
start = time.time()
result = await func(*args, **kwargs)
end = time.time()
print(f"Execution time: {end - start} seconds")
return result
return wrapper
@timer_decorator
async def async_operation():
await asyncio.sleep(1)
return "Operation completed"
Общие шаблоны декораторов
Шаблон |
Описание |
Пример |
Логирование |
Отслеживает вызовы функций |
Логирование входа/выхода метода |
Кэширование |
Сохраняет результаты функций |
Мемоизация |
Аутентификация |
Контролирует доступ |
Проверка прав пользователя |
Повтор (Retry) |
Реализует логику повторных попыток |
Обработка временных сбоев |
Лучшие практики
- Держите декораторы простыми и сосредоточенными
- Используйте
functools.wraps
для сохранения метаданных функции
- Избегайте сложной логики в декораторах
- Учитывайте последствия для производительности
Вопросы производительности
Декораторы добавляют небольшие накладные расходы из-за обертки функций. В коде, где критична производительность, используйте их осмотрительно.
Освоив декораторы, разработчики могут писать более модульный и поддерживаемый код, что является ценным навыком в продвинутых программировательных средах LabEx.