Когда вызывается декоратор класса?

Я использую библиотеку stanza NLP, которая использует декоратор для регистрации процессоров. У Stanza есть страница справки для создания собственных процессоров здесь

Они используют декоратор класса @register_processor("processor_name"). Код для register_processorвыглядит довольно просто. Он помещает имя процессора в словарь в качестве ключа и класс в качестве значения.

Мне неясно, когда вызывается декоратор или функция, прикрепленная к этому декоратору. Вызывается ли он непосредственно перед инициализированным классом или в какой-то другой момент?

Я пробовал поиск в Google, я нашел много информации о том, как использовать декораторы и когда вызываются декораторы функций, но я не смог легко найти этот конкретный ответ о декораторах классов.

1 ответ

Как сказал @jonrsharpe, он вызывается после создания класса. Вот пример подобного декоратора. (Обратите внимание, как register_classfunction фактически возвращает определенную внутреннюю функцию; это общий шаблон для любого декоратора в Python.)

      registry = {}


def register_class(name):
    def decorator(cls):
        registry[name] = cls
        print(f"Registered {name}: {cls}")
        return cls

    return decorator


print("Hello!")


@register_class("foo")
class Bloop:
    pass


print(f"Hi there! We have {registry} in the house.")


@register_class("another")
class Else:
    pass

print(f"Whew, that's a lot of classes! {registry}")

Это распечатывает

      Hello!
Registered foo: <class '__main__.Bloop'>
Hi there! We have {'foo': <class '__main__.Bloop'>} in the house.
Registered another: <class '__main__.Else'>
Whew, that's a lot of classes! {'foo': <class '__main__.Bloop'>, 'another': <class '__main__.Else'>}
Другие вопросы по тегам