gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 02:10:49 24 4
gpt4 key购买 nike

我有以下 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__ 函数显然对 Meta 类调用正确,但对派生的 Test 类调用不正确。

对于那些问“为什么”的人——我正在探索运行时类注册和修改,就像 Django 和 SqlAlchemy 这样的 ORM 框架。这可能不是我最终生成代码的方式,但我仍然希望得到 TypeError 异常原因的答案。

最佳答案

您的问题非常简单:__new__方法必须创建一个实例并返回它。你没有返回任何东西,所以它返回 None

因为这是一个元类的__new__,这意味着它被调用来构造Meta 类对象。因此,您刚刚将 Meta 定义为 None,而不是 _ClassMeta 类型的类。这是一件完全有效的事情,因此没有错误,但是一旦你尝试用它做任何事情,比如 Meta(),你就会得到一个关于 NoneType< 的异常 不可调用或类似。

这包括对其进行子类化。您不能子类化 None,因为它不是类型。

关于python - 为什么我的元类实现失败并出现关于无法创建 NoneType 实例的 TypeError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26517471/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com