Ответ 1
Нет. is
, and
и or
не могут быть перегружены.
Я пишу класс, который инкапсулирует любой произвольный объект, включая простые типы. Я хочу, чтобы ключевое слово "есть" использовалось для инкапсулированного значения, например, такое поведение:
Wrapper(True) is True -> True
Wrapper(False) is True -> False
Wrapper(None) is None -> True
Wrapper(1) is 1 -> True
Есть ли какой-либо метод объекта, который я могу переопределить, чтобы получить это поведение?
Нет. is
, and
и or
не могут быть перегружены.
Как правило, если вы хотите проверить равенство в терминах значения (если x равно 1 или True или None), вы все равно должны использовать оператор ==
. Если вы хотите использовать оператор is
, вы обычно тестируете, если что-то ссылается на что-то еще, например list1 is list2
.
Если вы хотите определить специальное поведение для ==
, вы можете определить __eq__
в своем определении класса.
is
само по себе не может быть перегружен, но вы можете быть заинтересованы в других "Отражение" Магические методы, которые могут быть пригодны для случая использования (так как вы смотрите на эту тему):
__instancecheck__(self, instance)
Проверяет, является ли экземпляр экземпляром определенного вами класса (например,isinstance(instance, class)
.
__subclasscheck__(self, subclass)
Проверяет, является ли класс подклассом класса, который вы определили (например,issubclass(subclass, class)
).
Нет.
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
Лучшее, что я могу сделать.