Python 为什么我的元类实现会失败,并出现一个关于无法创建非类型实例的TypeError

Python 为什么我的元类实现会失败,并出现一个关于无法创建非类型实例的TypeError,python,python-2.7,metaclass,Python,Python 2.7,Metaclass,我有以下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):

我有以下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
在与
类测试(Meta)的连线中:
我不明白为什么。元类的
\uuuu new\uuuu
函数显然是为元类调用的,但不是为派生测试类调用的


对于那些问“为什么”的人,我正在探索运行时类注册和修改,类似于Django和SqlAlchemy之类的ORM框架。这可能不是我最终生成代码的方式,但我仍然想知道为什么会出现TypeError异常。

您的问题非常简单:该方法必须创建一个实例并返回它。您没有返回任何内容,因此它返回
None

因为这是一个元类的
\uuuuuuuuuuuuuuuuu新的
,这意味着它被调用来构造
类对象。因此,您刚刚将
Meta
定义为
None
,而不是
\u ClassMeta
类型的类。这是一个非常有效的操作,因此没有错误,但是只要您尝试使用它做任何事情,比如
Meta()
,您就会得到一个异常,即
NoneType
不可调用或类似


这包括子类化它。您不能子类化
None
,因为它不是一个类型。

首先,这是Python2.x,对吗?元类是在2.x和3.x之间发生了巨大变化的东西之一,值得使用特定的标记…我已经添加了python-2.7标记,但是在将来,你应该自己做。哦!出现错误消息的原因是,在为测试创建类时,Meta为None。是的,很简单,想到我花了多长时间盯着它,我不寒而栗,不应该超过30秒。谢谢当accept块计时器用完时,我将接受