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

Eri*_*got 16 python subclass object instance

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

>>> class OldStyle(): pass
>>> issubclass(OldStyle, object)
False
>>> old_style = OldStyle()
>>> isinstance(old_style, object)
True
Run Code Online (Sandbox Code Playgroud)

ham*_*ene 18

在Python 2,类型是不一样的东西,具体而言,对于老式类,type(obj) 是不是同一个对象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>
Run Code Online (Sandbox Code Playgroud)

这在新式类中得到解决:

>>> 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'>
Run Code Online (Sandbox Code Playgroud)

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

>>> isinstance(A, type)
False
>>> isinstance(NA, type)
True
Run Code Online (Sandbox Code Playgroud)

声明旧样式类已弃用.在Python 3中,只有新式类; class A()相当于class A(object)并且您的代码将True在两个检查中产生.

看一下这个问题,进行更多讨论:Python中的旧样式和新样式类有什么区别?


geo*_*org 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
Run Code Online (Sandbox Code Playgroud)

请注意,这个问题基本上与旧式和新式类无关.isinstance(old_style, object)存在True只是python中的每个值都是一个实例的必然结果object.