Python: переопределение класса "is"

Я пишу класс, который инкапсулирует любой произвольный объект, включая простые типы. Я хочу, чтобы ключевое слово "есть" использовалось для инкапсулированного значения, например, такое поведение:

Wrapper(True) is True -> True
Wrapper(False) is True -> False
Wrapper(None) is None -> True
Wrapper(1) is 1 -> True

Есть ли какой-либо метод объекта, который я могу переопределить, чтобы получить это поведение?

Ответы

Ответ 1

Нет. is, and и or не могут быть перегружены.

Ответ 2

Как правило, если вы хотите проверить равенство в терминах значения (если x равно 1 или True или None), вы все равно должны использовать оператор ==. Если вы хотите использовать оператор is, вы обычно тестируете, если что-то ссылается на что-то еще, например list1 is list2.

Если вы хотите определить специальное поведение для ==, вы можете определить __eq__ в своем определении класса.

Ответ 3

is само по себе не может быть перегружен, но вы можете быть заинтересованы в других "Отражение" Магические методы, которые могут быть пригодны для случая использования (так как вы смотрите на эту тему):

__instancecheck__(self, instance) Проверяет, является ли экземпляр экземпляром определенного вами класса (например, isinstance(instance, class).

__subclasscheck__(self, subclass) Проверяет, является ли класс подклассом класса, который вы определили (например, issubclass(subclass, class)).

Ответ 4

Нет. is, and и or не могут быть перегружены.

Действительно. Я считаю, что ключевые слова зарезервированы и не могут быть перегружены или изменены.

См: http://docs.python.org/2/reference/lexical_analysis.html#keywords

"Следующие идентификаторы используются в качестве зарезервированных слов или ключевых слов для языка и не могут использоваться как обычные идентификаторы.

Список: ['и', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'exec', ' наконец, ',' for ',' from ',' global ',' if ',' import ',' in ',' is ',' lambda ',' not ',' or ',' pass ',' print ', 'raise', 'return', 'try', 'while', 'with', 'yield']

Этот список можно просмотреть с помощью команды

keyword.kwlist

(Не забывайте сначала импортировать ключевое слово)

также:

keyword.iskeyword( 'есть')

Возвращает True


Update:

Мой ответ был плохим, и мне было плохо.

Я сам испортил дель. Я не знаю, почему я этого не заметил...

Вторая попытка:

В следующей документации представлен полный список настраиваемых действий для классов. Сюда входят все методы переопределения и перегрузки операторов. 'is' не входит.

http://docs.python.org/2/reference/datamodel.html#special-method-names

Лучшее, что я могу сделать.