Как передать аргументы метаклассу из определения класса в Python 3.x?

Это версия Python 3.xКак передать аргументы метаклассу из определения класса? вопрос, указанный отдельно по запросу, так как ответ значительно отличается от Python 2.x.

В Python 3.x, как передать аргументы метаклассу__prepare__, __new__, а также__init__ функции, чтобы автор класса мог дать метаклассу информацию о том, как класс должен быть создан?

В моем случае я использую метаклассы, чтобы включить автоматическую регистрацию классов.и их подклассы в PyYAML для загрузки / сохранения YAML файлов. Это включает некоторую дополнительную логику времени выполнения, недоступную в запасе PyYAMLYAMLObjectMetaClass, Кроме того, я хочу разрешить авторам классов по желанию указывать tag / tag-format-template, который PyYAML использует для представления класса и / или объектов функций, используемых для конструирования и представления. Я уже понял, что я не могу использовать подкласс PyYAMLYAMLObjectMetaClass чтобы сделать это - «потому что у нас нет доступа к фактическому объекту класса в__new__"в соответствии с моим комментарием к коду - поэтому я пишу свой собственный метакласс, который охватывает функции регистрации PyYAML.

В конечном итоге я хочу сделать что-то вроде:

from myutil import MyYAMLObjectMetaClass

class MyClass(metaclass=MyYAMLObjectMetaClass):
    __metaclassArgs__ = ()
    __metaclassKargs__ = {"tag": "!MyClass"}

...где__metaclassArgs__ а также__metaclassKargs__ будут аргументы, идущие к__prepare__, __new__, а также__init__ методыMyYAMLObjectMetaClass когдаMyClass Объект класса создается.

Конечно, я мог бы использовать подход «зарезервированные имена атрибутов», перечисленные вверсия этого вопроса на Python 2.xНо я знаю, что есть более элегантный подход.

Ответы на вопрос(4)

Ваш ответ на вопрос