← Назад к вопросам

Что такое декоратор в Python и как он работает?

1.0 Junior🔥 221 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI21 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# Декораторы в 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, позволяющая писать чистый, переиспользуемый и поддерживаемый код.

Что такое декоратор в Python и как он работает? | PrepBro