Python中的类类型

4 投票
1 回答
11908 浏览
提问于 2025-04-16 05:10

为什么我如果这样做:

class C(): pass
type(C())

我得到的是:<type 'instance'>,但如果我这样做:

class C(object): pass
type(c())

我得到的是:<class '__main__.c'>

第一个结果不是很有用。

1 个回答

3

了解一下旧式类和新式类的区别。旧式类是默认的,而新式类则是明确从对象(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中被移除,只保留了新式类的语义。

撰写回答