Python 实例是一个";对象";,但类不是“的子类”;对象";:这怎么可能?

Python 实例是一个";对象";,但类不是“的子类”;对象";:这怎么可能?,python,object,instance,subclass,Python,Object,Instance,Subclass,如果类不是对象的子类,那么类的实例如何可能是对象?以下是一个例子: >>> class OldStyle(): pass >>> issubclass(OldStyle, object) False >>> old_style = OldStyle() >>> isinstance(old_style, object) True 一切都是对象: isinstance(123, object) # True isinstan

如果类不是
对象
的子类,那么类的实例如何可能是
对象
?以下是一个例子:

>>> class OldStyle(): pass
>>> issubclass(OldStyle, object)
False
>>> old_style = OldStyle()
>>> isinstance(old_style, object)
True

一切都是对象:

isinstance(123, object) # True
isinstance("green cheese", object) # True
isinstance(someOldClassObject, object) # True
isinstance(someNewClassObject, object) # True
isinstance(object, object) # True
isinstance(None, object) # True

请注意,这个问题本质上与旧样式和新样式的类无关
isinstance(旧样式,object)
being
True
仅仅是这样一个事实的推论,即python中的每个值都是执行表达式时对象的实例

   old_style = OldStyle()
这意味着您正在实例化对象,该旧样式是类OldStyle的实例

另外,在Python 3.2中,这两种方法的计算结果都是正确的。

在Python 2中,类型和类不是同一件事,特别是对于旧式类,
type(obj)
obj.\uuuuuu class\uuuuu
。因此,这是可能的,因为旧样式类的实例实际上与它们的类的类型不同(
instance
):

>>> class A(): pass
>>> class B(A): pass
>>> b = B()

>>> assert b.__class__ is B
>>> issubclass(b.__class__, A) # same as issubclass(B, A)
True
>>> issubclass(type(b), A)
False

>>> type(b)
<type 'instance'>
>>> b.__class__
<class __main__.B at 0x10043aa10>
旧样式的类被声明为已弃用。在Python3中,只有新样式的类
class A()
相当于
class A(object)
,您的代码将在这两个检查中产生
True


请看这个问题进行更多的讨论:

你有关于这个问题的参考资料吗?@EOL:非常有用,谢谢。我看了一下参考资料,但我找不到任何迹象表明Python中的所有内容都是类型
object
(事实上Python中的“所有内容都是对象”并不意味着相同的内容)。+1:这是一个非常清楚的描述,也是一个非常好的观点。谢谢对于任何想知道,
isinstance
是用于旧式实例和类的(即C中的
PyClass\u检查(cls)和&PyInstance\u检查(inst)
)。由于不存在基于类型的关系,因此它获取实例的
\uuuu class\uuuu
进行
issubclass
检查,这也适用于旧式类。
>>> class NA(object): pass
>>> class NB(NA): pass
>>> nb = NB()
>>> issubclass(type(nb), NA)
True
>>> type(nb)
<class '__main__.NB'>
>>> nb.__class__
<class '__main__.NB'>
>>> isinstance(A, type)
False
>>> isinstance(NA, type)
True