3

我正在阅读关于元类的这篇有趣的文章什么是 Python 中的元类?. 接受的答案显示了如何使用具有以下签名的类型创建一个类。

type(类名,父类元组(继承用,可以为空),包含属性名和值的字典)

我尝试使用上面的签名创建“类型”类,令我惊讶的是我一开始就被允许创建一个!感谢您的意见!

type = type('type',(),{});

其次,在我使用上述语法创建类型类后,我无法做到

myclass = type('myclass',(),{}); 

type = type('type',(),{});

我有一个错误说

Traceback(最近一次调用最后一次):文件“”,第 1 行,类型错误:对象。new () 不带参数

但是,当我尝试以下操作时,我可以成功。

class myclass(object):
    pass

我很困惑,因为根据我的理解,上面的代码片段应该调用 type 来尝试创建类“myclass”。发生什么了!?我错过了一些细节吗?

4

2 回答 2

6

你已经用 type with 遮蔽了 type withtype = type('type',(),{})

请注意,分号在 Python 中是多余的。

所以你正在创建一个不能做任何事情的类型。

这就是为什么后来的type休息。

于 2012-06-25T20:59:29.763 回答
0

定义

>>> shadow = type("type",(),{})
>>> shadow
<class '__main__.type'>
>>> isinstance(shadow,type)
True
>>> issubclass(shadow,type)
False
>>> shadow(int)

Traceback (most recent call last):
  File "<pyshell#7>", line 1, in <module>
    shadow(int)
TypeError: object.__new__() takes no parameters

建造

>>> class shadow(type):
    pass

>>> shadow
<class '__main__.shadow'>
>>> isinstance(shadow,type)
True
>>> issubclass(shadow,type)
True
>>> shadow(int)
<type 'type'>
>>> shadow(type)
<type 'type'>
>>> shadow(1)
<type 'int'>

Python(和 Python C API):__new__ 与 __init__

于 2012-06-25T21:20:39.280 回答