Метакласс __new__
не становится __new__
для создаваемого вами класса - он используется для создания самого класса. Фактический объект класса возвращается метаклассом. Новый экземпляр класса возвращается __new__
.
Рассмотрим следующий (безумный) код:
def MyMetaClass(name, bases, dict):
print "name", name
print "bases", bases
print "dict", dict
return 7
class C('hello', 'world'):
__metaclass__ = MyMetaClass
foo = "bar"
def baz(self, qux):
pass
print "C", C
(Я использовал функцию вместо класса в качестве метакласса. Любой вызываемый объект можно использовать в качестве метакласса, но многие люди выбирают свои классы, которые наследуют от type
с новым переопределением. функция тонкая.)
выводит
name C
bases ('hello', 'world')
dict {'baz': <function baz at 0x4034c844>, '__module__': '__main__', 'foo': 'bar', '__metaclass__': <function MyMetaClass at 0x40345c34>}
C 7
Помогает ли это вам лучше понять, какие метаклассы ?
Вам очень редко потребуется определить собственный метакласс.