加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 为什么我的元类实现因TypeError无法创建NoneType实例

发布时间:2020-12-20 11:38:31 所属栏目:Python 来源:网络整理
导读:我有以下 Python代码: class MetaData(object): _md = {}class _ClassMeta(type): def __new__(cls,clsname,bases,dct): ncls = super(_ClassMeta,cls).__new__(cls,dct) MetaData._md[clsname] = nclsclass Meta(object): __metaclass__ = _ClassMetaclass
我有以下 Python代码:

class MetaData(object):
    _md = {}

class _ClassMeta(type):
    def __new__(cls,clsname,bases,dct):
        ncls = super(_ClassMeta,cls).__new__(cls,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子类化,因为它不是一个类型.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读