在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()等效于
classA(object)并且您的代码将
True在两次检查中产生。
看一下这个问题进行更多讨论:Python中旧样式类和新样式类之间有什么区别?



