Ответ 1
В 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?