metaclass错误:type.__init__()接受1或3个参数
我有一个元类:
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'>
想了解更多关于元类和类型的信息,可以查看 这个链接。