在python中使用类型类创建一个类型类

时间:2012-06-25 20:54:35

标签: python metaclass

我正在阅读关于元类What is a metaclass in Python?的这篇有趣的帖子。接受的答案显示了如何使用具有以下签名的类型创建类。

  

类型(类的名称,         父类的元组(对于继承,可以为空),         包含属性名称和值的字典)

我尝试使用上面的签名创建'type'类,我很惊讶我被允许首先创建一个!感谢您的意见!

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

其次,在使用上面的语法创建了一个类型类之后,我无法做到

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

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

我说错误

  

Traceback(最近一次调用最后一次):文件“”,第1行,in    TypeError:object。 new ()不带参数

但是,当我尝试以下内容时,我可以成功。

class myclass(object):
    pass

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

2 个答案:

答案 0 :(得分:6)

您使用type = type('type',(),{})

类型的阴影类型

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

所以你要创建一个无法做任何事情的类型。

这就是后来type休息的原因。

答案 1 :(得分: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 (and Python C API): __new__ versus __init__