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

Какой знаешь способ декорирования функции без знака "@"?

2.0 Middle🔥 91 комментариев
#Python Core

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

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

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

Способы декорирования функции без знака "@"

Декоратор в Python — это функция высшего порядка, которая принимает другую функцию и расширяет её поведение, не изменяя исходный код. Символ @ — это синтаксический сахар для удобства, но существуют альтернативные способы применения декораторов.

1. Прямое переприсвоение функции

Самый простой способ — явно переприсвоить функцию результату вызова декоратора:

def my_decorator(func):
    def wrapper(*args, **kwargs):
        print("Функция вызывается...")
        result = func(*args, **kwargs)
        print("Функция завершена.")
        return result
    return wrapper

def greet(name):
    return f"Hello, {name}!"

greet = my_decorator(greet)
greet("Alice")

2. Применение декоратора через вызов функции

Можно использовать переменную и затем применить декоратор:

def timing_decorator(func):
    import time
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        print(f"Время выполнения: {end - start:.4f} сек")
        return result
    return wrapper

def slow_function():
    import time
    time.sleep(1)
    return "Done"

slow_function = timing_decorator(slow_function)
slow_function()

3. Встроенные функции как декораторы

Python предоставляет встроенные инструменты:

from functools import wraps

def log_decorator(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        print(f"Вызов: {func.__name__}")
        return func(*args, **kwargs)
    return wrapper

def calculate(a, b):
    return a + b

calculate = log_decorator(calculate)
print(calculate.__doc__)

4. Использование classmethod и staticmethod

Эти встроенные декораторы тоже можно применить без символа @:

class Calculator:
    def add(a, b):
        return a + b

Calculator.add = staticmethod(Calculator.add)
print(Calculator.add(5, 3))

5. Цепочка нескольких декораторов

Можно применять несколько декораторов последовательно:

def uppercase_decorator(func):
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        return result.upper() if isinstance(result, str) else result
    return wrapper

def exclamation_decorator(func):
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        return result + "!" if isinstance(result, str) else result
    return wrapper

def say_hello(name):
    return f"hello, {name}"

say_hello = uppercase_decorator(say_hello)
say_hello = exclamation_decorator(say_hello)
print(say_hello("world"))

6. Практическое применение

Плагины и динамическая регистрация — когда функция добавляется в систему после её определения

Monkey-patching — модификация поведения существующего кода

Парсинг и генерация кода — когда декораторы применяются программно

Тестирование — когда нужно временно применить декоратор к функции

Хотя символ @ — это стандартный и читаемый способ применения декораторов, язык позволяет применять их явно через переприсвоение. Это демонстрирует глубокое понимание того, что декораторы — это просто функции высшего порядка.

Какой знаешь способ декорирования функции без знака "@"? | PrepBro