Проблема заключается в том, что при обновлении с python 2.5 до python 2.6 type.__init__()
был изменен, так что вам больше не требуется вводить cls
.Так что просто сделайте вызов super
:
return super(MyMeta, cls).__init__(name, bases, dct)
Другое решение состоит в том, чтобы вообще избежать вызова super
и сделать это (хотя это немного менее приятно):
return type.__init__(cls, name, bases, dct)
И все будет работать нормально (в python> = 2.6).
Относительно того, почему type.__init__()
может принимать различное количество аргументов, ознакомьтесь с документацией .Это так, что, помимо использования его в качестве конструктора, вы можете вызвать type(myobject)
, и он вернет тип myobject
:
>>> number = 1
>>> type(number)
<type 'int'>
>>> type('my string')
<type 'str'>
См. Что такое метакласс в Python? для получения дополнительной информации о метаклассах и типах.