Python中的类类型
为什么我如果这样做:
class C(): pass
type(C())
我得到的是:<type 'instance'>
,但如果我这样做:
class C(object): pass
type(c())
我得到的是:<class '__main__.c'>
?
第一个结果不是很有用。
1 个回答
了解一下旧式类和新式类的区别。旧式类是默认的,而新式类则是明确从对象(object)继承而来的。
所有的旧式对象都是用内置的类型实例来实现的。它们仍然是默认类型,并且类型保持为'instance',这是为了兼容旧版本的考虑。
这段内容摘自Python文档(http://docs.python.org/reference/datamodel.html)
3.3. 新式类和经典类 类和实例有两种类型:旧式(或经典)和新式。
在Python 2.1之前,旧式类是用户唯一可以使用的类型。旧式类的概念与类型的概念无关:如果
x
是一个旧式类的实例,那么x.__class__
表示的是x
的类,但type(x)
总是<type 'instance'>
。这反映了所有旧式实例都是用一个叫做实例的内置类型实现的,无论它们的类是什么。新式类是在Python 2.2中引入的,目的是统一类和类型。新式类就是用户自定义的类型。如果
x
是新式类的实例,那么type(x)
通常和x.__class__
是一样的(虽然这并不是绝对的——新式类的实例可以覆盖x.__class__
返回的值)。引入新式类的主要动机是提供一个统一的对象模型,并且有一个完整的元模型。它还有很多实际的好处,比如可以对大多数内置类型进行子类化,或者引入“描述符”,使得可以计算属性。
出于兼容性原因,类默认仍然是旧式的。新式类是通过指定另一个新式类(即一个类型)作为父类来创建的,或者如果不需要其他父类,则使用“顶层类型”对象。新式类的行为与旧式类在许多重要细节上有所不同,除了
type()
返回的内容。一些变化是新对象模型的基础,比如特殊方法的调用方式。其他一些变化是“修复”,因为之前出于兼容性原因无法实现,比如在多重继承情况下的方法解析顺序。虽然本手册旨在全面覆盖Python的类机制,但在新式类的覆盖方面可能仍然存在一些不足。请查看http://www.python.org/doc/newstyle/以获取更多信息。
旧式类在Python 3.0中被移除,只保留了新式类的语义。