python创建实例失败_python – 为什么我的元类实现因TypeError无法创建NoneType实例而失败...

我有以下

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子类化,因为它不是一个类型.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值