1

我正在阅读一本关于 Python 的教科书,它涵盖了新型类差异。在使用经典类的解释器中观察 Python 2.X 中的以下代码:

class C: pass
X = C()
isinstance(X, object) #returns true
isinstance(C, object) #returns true

(要使用新式类,必须明确派生自 2.X 中的对象类)

那么一个不从对象类派生的对象(如经典类中的情况)如何成为对象的实例呢?在 3.X 和 2.X 的情况下,幕后发生了什么?

至于这是否是一个重复的问题:我已经知道一切在技术上都是一个对象,我想知道在 python 本身的设计中如何明确处理差异,而不是认为 isinstance 的结果是理所当然的。

4

3 回答 3

0

Python 中的一切都是 的实例object,包括object它自己:

>>> isinstance(object, object)
True

这是因为无论其他参数是什么,当传入for时,type.__instancecheck__钩子都会返回(请记住,特殊方法是在 上查找的,而不是在其自身上查找的,并且是手动传入的)。Trueobjectselftype(something)somethingself

如果您想测试旧式类,更有用的测试是该类是 的实例type还是 的object

>>> isinstance(C, type)
False
>>> issubclass(C, object)
False

这些测试中的任何一个都适用于新式类:

>>> class Newstyle(object): pass
...
>>> isinstance(Newstyle, type)
True
>>> issubclass(Newstyle, object)
True

例如,测试它们是否是以下实例types.InstanceType

>>> isinstance(X, InstanceType)
True
于 2017-07-12T21:09:05.460 回答
0

您可能isinstanceissubclass. 旧式类不是从will的结果的含义派生出来的。另一方面,新样式类总是包含(直接或间接)作为基类。objectissubclass(C, object)Falseobject

一切都是object. 这样做isinstance(C, object)isinstance(x, object)将永远如此True

于 2017-07-12T21:06:28.813 回答
0

X 是旧式类 C 的旧式实例,它不是object.

但是,所有对象,甚至是旧式实例,都是某种类型的实例(又名新式类)。所有旧式实例的类型都是types.InstanceType; 再加上types.ClassType,旧式类的类型,这两种类型负责旧式类系统的实现。

types.InstanceType是 的子类object,所有新式类也是。isinstance(X, object)返回 true 不是因为 X 的旧式类继承自object,而是因为它的新式类继承。

于 2017-07-13T17:37:32.213 回答