#python #python-3.x
#python #python-3.x
Вопрос:
Мне кажется, что многие типичные примеры использования метакласса, которые люди приводят, в которых __init__
метод метакласса cls
каким-то образом изменяет аргумент, могут быть просто выполнены путем изменения __new__
класса вместо этого.
Какие практические вещи можно выполнить, создав метакласс, но не изменив __new__
?
Комментарии:
1. Все, что связано с тем, как инициализируется объект класса? Когда вы пишете оператор определения класса,
class Foo: pass
это неявный вызовtype
конструктора,type('Foo', (object,), {})
. Все, что вы хотите контролировать в этом процессе, должно происходить в метаклассе (переопределяяtype
поведение метакласса по умолчанию)2. Вот пример, предположим, вы хотите изменить поведение
print(MyClass)
whereMyClass
является некоторым классом. Тогда вы ничего не можете с этим поделать в определенииMyClass
, вам нужно определить метакласс, который переопределяет__repr__
or__str__
. Или подумайтеenum
. Это в значительной степени зависит от метаклассов. Простой пример, предположим, у вас есть тип перечисления,Color
, вы можете перебирать перечисления, повторяя классfor color in Colors:
, опять же, вы должны определить__iter__
в метаклассе3. @juanpa.arrivillaga Я вижу. Спасибо за примеры, это имеет большой смысл. Многие примеры, которые я видел, как правило, касаются поведения объектов класса, и я думаю, именно поэтому я был сбит с толку.
4. Вы можете делать практически все, используя МетаКласс, например, изменять атрибуты, изменять наследование класса, изменять свойство и метод класса
5. @wetler Верно, но я говорил, что все это может быть выполнено путем переопределения
__new__
в классе. Приведенный выше пример изменения__str__
самого класса имеет смысл, но это не то, что я лично хотел сделать.