Что такое декоратор в Python и как он работает?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
# Декораторы в Python
Декоратор — это функция, которая принимает другую функцию как аргумент и возвращает новую функцию с расширенной функциональностью. Декораторы позволяют модифицировать поведение функции без изменения её исходного кода.
Как работает декоратор
Декоратор оборачивает исходную функцию в wrapper функцию. Когда мы вызываем оригинальную функцию, на самом деле вызывается wrapper, которая может выполнить код до, после или вместо оригинальной функции.
def my_decorator(func):
def wrapper(*args, **kwargs):
print(f"Функция {func.__name__} вызвана")
result = func(*args, **kwargs)
print(f"Функция завершена")
return result
return wrapper
@my_decorator
def greet(name):
return f"Привет, {name}!"
print(greet("Алиса"))
Практические примеры
Логирование
import functools
def log_calls(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
print(f"Вызов: {func.__name__}")
return func(*args, **kwargs)
return wrapper
@log_calls
def divide(a, b):
return a / b
Кеширование результатов
from functools import lru_cache
@lru_cache(maxsize=128)
def fibonacci(n):
if n < 2:
return n
return fibonacci(n-1) + fibonacci(n-2)
Проверка прав доступа
def require_auth(func):
@functools.wraps(func)
def wrapper(user, *args, **kwargs):
if not user.is_authenticated:
raise PermissionError("Требуется аутентификация")
return func(user, *args, **kwargs)
return wrapper
@require_auth
def delete_user(user, user_id):
pass
Декоратор с параметрами
def repeat(times):
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
results = []
for _ in range(times):
results.append(func(*args, **kwargs))
return results
return wrapper
return decorator
@repeat(times=3)
def say_hello():
return "Hello!"
print(say_hello())
Важные детали
functools.wraps: Используйте @functools.wraps(func) внутри wrapper, так как она сохраняет исходные метаданные функции (name, doc).
Декораторы в Django и FastAPI
В профессиональной разработке декораторы используются постоянно:
from django.db import transaction
from fastapi import Depends
@transaction.atomic
def create_user(email):
user = User.objects.create(email=email)
Profile.objects.create(user=user)
@app.get("/users/{user_id}")
async def get_user(user_id: int):
return await db.get_user(user_id)
Декораторы — фундаментальная концепция в Python, позволяющая писать чистый, переиспользуемый и поддерживаемый код.