Как передать аргументы метаклассу из определения класса в 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Но я знаю, что есть более элегантный подход.