metaclass错误:type.__init__()接受1或3个参数

6 投票
1 回答
9620 浏览
提问于 2025-04-17 12:43

我有一个元类:

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 个回答

9

问题在于,从 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'>

想了解更多关于元类和类型的信息,可以查看 这个链接

撰写回答