在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>
这在新型类中得以解决:
>>> 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
旧样式类被声明为已弃用。在Python 3中,只有新型类。class A()
等效于class A(object)
并且您的代码将True
在两次检查中产生。
看一下这个问题进行更多讨论:Python中旧样式类和新样式类之间有什么区别?