Здравствуй, Хабр.
Я всегда был уверен, что в Python для объектов новых классов атрибут
x.__class__ и
type(x) будут иметь одно и то же значение. Однако если проделать вот такое (проверено с Python 2.7.3 и 3.3.0, а также PyPy 2.0b1):
>>> import weakref
>>> x = set()
>>> y = weakref.proxy(x)
>>> x.__class__, type(x), isinstance(x, set)
(<class 'set'>, <class 'set'>, True)
>>> y.__class__, type(y), isinstance(y, set)
(<class 'set'>, <class 'weakproxy'>, True)
мы увидим, что для
weakref.proxyy.__class__ соответствует обернутому типу (полагаю,
weakref.proxy просто подменяет атрибут, чтобы мимикрировать под оборачиваемый объект), и даже
isinstance распознает в нем
set. Но при этом
type указывает на его истинный тип —
weakproxy. Получается, что
type не использует для определения типа аргумента его атрибут
__class__. Выходит, что он
type пользуется неким «более достоверным» источником для определения типа? Можно ли получить к нему доступ?