Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про JavaScript: decorator, callable, function, class, __call__

Может ли любой callable-объект использоваться как декоратор?

Вопрос проверяет понимание того, что декоратором может быть любой callable-объект, включая функции, классы и объекты с методом __call__.

Короткий ответ

Да, любой callable-объект может использоваться как декоратор. Декоратор — это просто объект, который можно вызвать и который принимает функцию или класс в качестве аргумента, возвращая замену. Это могут быть функции, классы или экземпляры классов с методом __call__.

Длинный ответ

Что такое callable-объект?

Callable-объект — это любой объект, который можно вызвать с помощью круглых скобок. В Python к ним относятся функции, классы, а также экземпляры классов, у которых определён метод __call__. Декоратор — это просто callable, который принимает функцию или класс и возвращает их модифицированную версию.

Примеры декораторов

Рассмотрим три способа создания декоратора:

  • Функция-декоратор — самый распространённый вариант.
  • Класс-декоратор — класс, который принимает функцию в __init__ и делает экземпляр callable через __call__.
  • Экземпляр с __call__ — объект класса, который уже настроен и может быть вызван как декоратор.
# Функция-декоратор
def my_decorator(func):
    def wrapper():
        print('Before')
        func()
        print('After')
    return wrapper

# Класс-декоратор
class ClassDecorator:
    def __init__(self, func):
        self.func = func
    def __call__(self):
        print('Before')
        self.func()
        print('After')

# Экземпляр с __call__ как декоратор
class CallableInstance:
    def __call__(self, func):
        def wrapper():
            print('Before')
            func()
            print('After')
        return wrapper

my_instance = CallableInstance()

@my_decorator
def say_hello():
    print('Hello')

@ClassDecorator
def say_hi():
    print('Hi')

@my_instance
def say_hey():
    print('Hey')

Где это применяется?

Возможность использовать любой callable как декоратор даёт гибкость: можно создавать параметризованные декораторы через классы, хранить состояние в экземплярах или переиспользовать логику. Это часто используется в фреймворках (например, Flask, Django) для регистрации маршрутов или middleware.

Вывод: Любой callable-объект может быть декоратором, что позволяет выбирать наиболее удобный способ реализации в зависимости от задачи — от простых функций до сложных классов с состоянием.

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    4

  • Сложность:

    4

Навыки

  • JavaScript

    JavaScript

Ключевые слова

#decorator

#callable

#function

#class

#__call__

Подпишись на Python Developer в телеграм

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.