Что вы можете сделать с метаклассом, чего вы не можете сделать с __new__ ?

#python #python-3.x

#python #python-3.x

Вопрос:

Мне кажется, что многие типичные примеры использования метакласса, которые люди приводят, в которых __init__ метод метакласса cls каким-то образом изменяет аргумент, могут быть просто выполнены путем изменения __new__ класса вместо этого.

Какие практические вещи можно выполнить, создав метакласс, но не изменив __new__ ?

Комментарии:

1. Все, что связано с тем, как инициализируется объект класса? Когда вы пишете оператор определения класса, class Foo: pass это неявный вызов type конструктора, type('Foo', (object,), {}) . Все, что вы хотите контролировать в этом процессе, должно происходить в метаклассе (переопределяя type поведение метакласса по умолчанию)

2. Вот пример, предположим, вы хотите изменить поведение print(MyClass) where MyClass является некоторым классом. Тогда вы ничего не можете с этим поделать в определении MyClass , вам нужно определить метакласс, который переопределяет __repr__ or __str__ . Или подумайте enum . Это в значительной степени зависит от метаклассов. Простой пример, предположим, у вас есть тип перечисления, Color , вы можете перебирать перечисления, повторяя класс for color in Colors: , опять же, вы должны определить __iter__ в метаклассе

3. @juanpa.arrivillaga Я вижу. Спасибо за примеры, это имеет большой смысл. Многие примеры, которые я видел, как правило, касаются поведения объектов класса, и я думаю, именно поэтому я был сбит с толку.

4. Вы можете делать практически все, используя МетаКласс, например, изменять атрибуты, изменять наследование класса, изменять свойство и метод класса

5. @wetler Верно, но я говорил, что все это может быть выполнено путем переопределения __new__ в классе. Приведенный выше пример изменения __str__ самого класса имеет смысл, но это не то, что я лично хотел сделать.