Экземпляр - это "объект", но класс не является подклассом "объекта": как это возможно?

Как возможно иметь экземпляр класса, который является object, без класса, являющегося подклассом object? вот пример:

>>> class OldStyle(): pass
>>> issubclass(OldStyle, object)
False
>>> old_style = OldStyle()
>>> isinstance(old_style, object)
True

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

Ответ 2

Все это объект:

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

Обратите внимание, что этот вопрос не имеет ничего общего со старыми классами. isinstance(old_style, object) True является просто следствием того, что каждое значение в python является экземпляром object.

Ответ 3

Когда вы выполняете выражение

   old_style = OldStyle()

Это означает, что вы создаете экземпляр объекта, который old_style является экземпляром класса OldStyle.

Также оба оценивают значение True в Python 3.2.