Python 1或Python 2中能否创建非类的新type?实现方式是什么?
结论
- Python 1 全版本、Python 2.1.x及更低版本:无法创建新的
type类型实例,这些版本还未引入新式类和元类体系,object基类本身不存在,内建type也不支持用户自定义扩展。 - Python 2.2及以上的2.x版本:可以创建新的
type(即新式类),你给出的第二个Python2代码示例中生成的foo本身就是符合要求的type类型实例,它和旧式类的classobj有本质区别。
具体实现方法
方法1:显式声明继承object的新式类
只要自定义类显式继承object,生成的类就是type的实例:
#!/usr/bin/env python2 class foo(object): pass print(type(foo)) # 输出:<type 'type'>
方法2:调用元类type动态生成
type本身是元类,可以直接调用它的构造方法动态创建新式类,语法为type(类名, 父类元组, 类属性字典):
#!/usr/bin/env python2 # 等价于上面的类声明写法 foo = type('foo', (object,), {}) print(type(foo)) # 输出:<type 'type'>
原理补充
Python 2 中旧式类(不继承
object的类)的默认元类是types.ClassType,所以旧式类的类型为classobj;而新式类(继承object的类)的默认元类是内建的type,因此你创建的新式类本身就是type的实例,也就是你所问的「新的type」。
内容的提问来源于stack exchange,提问作者Chen-Y0y0
相关产品推荐
相关产品推荐

