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

2024-09-28 21:05:10 发布

您现在位置:Python中文网/ 问答频道 /正文

在没有object的子类的情况下,如何可能拥有一个object类的实例?下面是一个例子:

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

Tags: 实例falsetrueobjectstyle情况pass子类
3条回答

一切都是一个物体:

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(old_style, object)True,这只是python中每个值都是object的一个实例这一事实的必然结果。在

当你做表情的时候

   old_style = OldStyle()

这意味着您正在实例化对象,其中old_style是OldStyle类的实例。在

另外,在python3.2中,两者的计算结果都为True。在

在Python2中,类型不是一回事,特别是对于旧样式的类,type(obj)is not the same object与{}是不一样的。所以这是可能的,因为旧样式类的实例实际上与它们的类具有不同的类型(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>

这在新样式的类中解决:

^{pr2}$

旧样式类不是类型,新样式类是:

>>> isinstance(A, type)
False
>>> isinstance(NA, type)
True

旧样式类被声明为已弃用。在python3中,只有新样式的类;class A()相当于class A(object),并且您的代码在这两个检查中都将生成True。在

请看这个问题进行更多讨论:What is the difference between old style and new style classes in Python?

相关问题 更多 >