Why does isinstance(nonnewstyle, object) return true in Python 2.X?
我正在读一本关于Python的教科书,它涵盖了新的课堂差异。在使用经典类的解释器中,观察python 2.x中的以下代码:
1 2 3 4 | class C: pass X = C() isinstance(X, object) #returns true isinstance(C, object) #returns true |
(要使用新样式的类,必须从2.x中的对象类显式派生)
那么,一个不从对象类派生(就像经典类那样)的对象怎么可能是对象的实例呢?在3.x和2.x的情况下,幕后发生了什么?
至于这是否是一个重复的问题:我已经知道技术上一切都是一个对象,我想知道在Python本身的设计中如何显式地处理这种差异,而不是想当然地认为IsInstance的结果。
x是旧样式类c的旧样式实例,它不是
但是,所有对象,甚至是旧样式实例,都是某种类型的实例(也就是新样式类)。所有旧样式实例的类型都是
python中的一切都是
1 2 | >>> isinstance(object, object) True |
这是因为当
如果要测试旧样式的类,一个更有用的测试是如果该类是
1 2 3 4 | >>> isinstance(C, type) False >>> issubclass(C, object) False |
对于新样式的类,这些测试中的任何一个都是正确的:
1 2 3 4 5 6 | >>> class Newstyle(object): pass ... >>> isinstance(Newstyle, type) True >>> issubclass(Newstyle, object) True |
例如,测试它们是否是
1 2 | >>> isinstance(X, InstanceType) True |
你可能把
一切都是