我有以下
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
与类Test(Meta)一致:我不明白为什么.元类的__new__函数显然被称为Meta类,但不适用于派生的Test类.
对于那些问“为什么”的人 – 我正在探索运行时类注册和修改像Django和SqlAlchemy这样的ORM框架.这可能不是我最终会生成我的代码的方式,但我仍然想知道为什么我会收到TypeError异常.
最佳答案 您的问题非常简单:
__new__
方法必须创建一个实例并将其返回.你没有返回任何东西,所以它返回None.
由于这是一个元类的__new__,这意味着它被调用来构造Meta类对象.所以你刚刚将Meta定义为None,而不是_ClassMeta类型.这是一个非常有效的事情,因此没有错误,但是一旦你尝试对它做任何事情,比如Meta(),你将得到关于NoneType不可调用或类似的异常.
这包括继承它.你不能将None子类化,因为它不是一个类型.