Это версия Python 3.x Как передать аргументы метаклассу из определения класса? вопрос, указанный отдельно по запросу, так как ответ значительно отличается от Python 2.x.
В Python 3.x как передать аргументы в функции метакласса __prepare__
, __new__
и __init__
чтобы автор класса мог предоставить метаклассу информацию о том, как должен создаваться класс?
В моем случае я использую метаклассы, чтобы включить автоматическую регистрацию классов и их подклассов в PyYAML для загрузки/сохранения YAML файлов. Это включает в себя некоторую дополнительную логику времени выполнения, недоступную в YAMLObjectMetaClass
PyYAML. Кроме того, я хочу разрешить авторам классов по желанию указывать tag/tag-format-template, который PyYAML использует для представления класса и/или объектов функций, используемых для конструирования и представления. Я уже понял, что не могу использовать подкласс PyYAML YAMLObjectMetaClass
для выполнения this-- "потому что у нас нет доступа к реальному объекту класса в __new__
" согласно моему комментарию к коду - поэтому я пишу мой собственный метакласс, который охватывает функции регистрации PyYAML.
В конечном итоге я хочу сделать что-то вроде:
from myutil import MyYAMLObjectMetaClass
class MyClass(metaclass=MyYAMLObjectMetaClass):
__metaclassArgs__ = ()
__metaclassKargs__ = {"tag": "!MyClass"}
... где __metaclassArgs__
и __metaclassKargs__
будут аргументами, идущими к __prepare__
, __new__
и __init__
объекта MyYAMLObjectMetaClass
когда MyYAMLObjectMetaClass
объект класса MyClass
.
Конечно, я мог бы использовать подход "зарезервированные имена атрибутов", приведенный в версии этого вопроса на Python 2.x, но я знаю, что существует более элегантный подход.