Экземпляр - это «объект», но класс не является подклассом «объекта»: как это возможно? - PullRequest
16 голосов
/ 14 марта 2012

Как можно получить экземпляр класса, который является object, но не является подклассом класса object? Вот пример:

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

Ответы [ 3 ]

18 голосов
/ 14 марта 2012

В 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?

6 голосов
/ 14 марта 2012

Все является объектом:

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.

1 голос
/ 14 марта 2012

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

   old_style = OldStyle()

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

Кроме того, оба значения имеют значение True в Python 3.2.

...