为什么我的元类实现失败并出现关于无法创建 NoneType 实例的 TypeError



我有以下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进行子类化,因为它不是一个类型。

相关内容

最新更新