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

时间:2012-03-14 09:56:48

标签: python object instance subclass

如果一个类的实例是object,如果没有该类是object的子类,怎么可能?这是一个例子:

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

3 个答案:

答案 0 :(得分:18)

在Python 2中, type class 不一样,特别是对于旧式类,type(obj) is not the same object为{ {1}}。所以它是可能的,因为旧式类的实例实际上与它们的类不同(obj.__class__):

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>

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

>>> 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'>

声明旧样式类已弃用。在Python 3中,只有新式类; >>> isinstance(A, type) False >>> isinstance(NA, type) True 相当于class A(),您的代码会在两次检查中产生class A(object)

请查看此问题以获得更多讨论:What is the difference between old style and new style classes in Python?

答案 1 :(得分:6)

一切都是对象:

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实例的必然结果。

答案 2 :(得分:1)

当您执行表达式

   old_style = OldStyle()

这意味着您要实例化对象,old_style是OldStyle类的一个实例。

此外,两者都在Python 3.2中评估为True。