我有以下Python代码:
class MetaData(object):
_md = {}
class _ClassMeta(type):
def __new__(cls, clsname, bases, dct):
ncls = super(_ClassMeta, cls).__new__(cls, clsname, bases, dct)
MetaData._md[clsname] = ncls
class Meta(object):
__metaclass__ = _ClassMeta
class Test(Meta):
pass
当我尝试执行它时,我得到这个:
TypeError: Error when calling the metaclass bases
cannot create 'NoneType' instances
与class Test(Meta):
我不明白为什么。 元类的__new__
函数显然适用于元类,但不适用于派生的 Test 类。
对于那些问"为什么"的人 - 我正在探索运行时类注册和修改,就像Django和SqlAlchemy这样的ORM框架一样。 这可能不是我最终生成代码的方式,但我仍然想回答为什么我会收到 TypeError 异常。
你的问题很简单:__new__
方法必须创建一个实例并返回它。您没有返回任何内容,因此它会返回None
.
由于这是一个元类的__new__
,这意味着它被调用来构造Meta
类对象。所以你刚刚将Meta
定义为None
,而不是_ClassMeta
类型的类。这是一件完全有效的事情,因此没有错误,但是一旦您尝试使用它做任何事情,例如 Meta()
,您将获得有关NoneType
不可调用或类似的异常。
这包括对其进行子类化。你不能对None
进行子类化,因为它不是一个类型。