Есть ли какое-либо значение в Python, для которого isinstance (значение, объект) не является True? - PullRequest
6 голосов
/ 09 марта 2012

Насколько я понимаю, поскольку унификация типа / класса каждое значение относится к типу, производному от object. Однако я не могу найти абсолютное подтверждение этого в документах. Хотя само собой разумеется, что isinstance(anything, object) всегда должно быть True, я мог бы также представить, что в базе кода Python 2 существуют устаревшие крайние случаи. Кто-нибудь знает пример, где isinstance(value, object) это не True?

Контекст: как часть иерархии типов, которую я разрабатываю, есть всеобъемлющий тип Alpha, для которого я хочу, чтобы isinstance(obj, Alpha) всегда возвращал True. Я думаю, что на Python 2.6+ ABCMeta.register(object) должен добиться цели, но я хочу быть уверен.

РЕДАКТИРОВАТЬ: Ради потомков, ABCMeta.register(object) не будет работать (попробуйте). Итан Фурман предлагает альтернативное решение для этого случая в своем ответе ниже.

Ответы [ 2 ]

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

Можно создавать классы в не-Python-коде (например, C), которые не являются производными от object.

Вы сможете достичь желаемого, добавив __subclasshook__ к вашему Alpha:

--> import abc
--> class Test(object):
...   __metaclass__ = abc.ABCMeta
...   @classmethod
...   def __subclasshook__(cls, C):
...     return True
...
--> isinstance(dict(), Test)
True
--> isinstance(42, Test)
True
--> isinstance(0.59, Test)
True
--> class old_style:
...     pass
...
--> isinstance(old_style(), Test)
True
0 голосов
/ 10 марта 2012

В 2.x пользовательские классы (и несколько классов stdlib) не наследуются от объекта по умолчанию.Это исправлено в 3.x.

...