ошибка метакласса: тип .__ init __ () принимает 1 или 3 аргумента - PullRequest
5 голосов
/ 10 февраля 2012

У меня есть метакласс:

class MyMeta(type):
    def __init__(cls, name, bases, dct):
        # Do something
        ...

        return super(MyMeta, cls).__init__(cls, name, bases, dct)

и класс:

class MyClass(object):
    __metaclass__ = MyMeta

Когда я их использую, я получаю следующую ошибку:

TypeError: Error when calling the metaclass bases
    type.__init__() takes 1 or 3 arguments

В чем проблема, и почему type.__init__() принимает точно переменное количество аргументов?

1 Ответ

8 голосов
/ 10 февраля 2012

Проблема заключается в том, что при обновлении с 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? для получения дополнительной информации о метаклассах и типах.

...