В Python 2 type и class - это не одно и то же, в частности, для классов старого стиля 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?