类型和类之间有什么区别吗?

5
我在阅读一本Python书籍,它经常讲到“给定X其类型为Y”,我感到困惑。
在Python2和Python3中,询问对象的类型和成员所属的类之间存在区别吗?
我的意思是,类型和类是两个不同的概念吗?
这个问题源于在Python 2.1之前的版本中,调用x.__class__和type(x)之间存在差异。
2个回答

4
在Python 2.2之前,“[经典]类”和“[内置]类型”之间有所不同。基本上,您不能对内置类型进行子类化,并且它们具有其他特殊行为,使它们与用户定义的类不同。Python创建者Guido van Rossum的这篇博客文章解释了一些将用户定义的类和内置类型统一到“新样式类”框架下的动机。Python维基还提供一些关于经典类和新样式用户定义类之间实际差异的良好背景。简而言之,在Python 2.7中,您仍然可以创建“经典类”,以保持向后兼容性,但内置类型的行为就像新样式类。

因此,在Python 2.2之前,所有东西在某种程度上都是内置类型的实例,即使一个类也是内置类型“instance”的一个实例,这个“类”只是一个标签,用于区分对象属于哪个类的特定实例。这样说对吗? - zer0uno
基本上没错:用户定义的经典类在实例化时会生成具有通用“实例”类型的对象,并附加一些特定于类的属性和方法。我认为我链接的GvR博客文章可以更深入地了解它。如果您坚持使用新式类,您将永远不必在现代Python中考虑这些问题。 - Dan Lenski

2
不���type和class是相同的意思。
不过,内置类型和C扩展(解释器扩展,例如Jython中的Java类)可能会有所不同,例如您可能无法对其进行monkey-patch。在旧版本的CPython中,还存在内置子类化的问题,但那是很久以前的事情了,我只是读到过,没有亲眼见过。
此外,在Python2中,旧式类和新式类有所区别,但在这种情况下并不重要。
最终有许多“类型的类型”,但名称“class”和“type”是等效的。仍然 - “type”更常用于内置对象,而class则不太常用。对于非内置对象,两个名称都很常见。

这在较旧版本的Python中并不正确;请参见我上面的答案。可能@antox正在阅读一本或者是针对较旧版本的Python编写的文档,这可能会导致混淆。 - Dan Lenski
2
我首先提供了简短的答案,然后我编辑了帖子并加强了它。我们似乎在一两分钟内发布了帖子 ;) - Filip Malczak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接