Переопределение метода "в" в классе - PullRequest
4 голосов
/ 24 февраля 2012

Я создаю абстрактный тип данных, который создает двусвязный список (не уверен, что это правильный перевод).В нем я создал метод __len__, чтобы правильно рассчитать длину, метод __repr__, чтобы правильно его представить, но я не хочу сейчас создавать метод, который, когда пользователь сделает что-то вроде:

if foo in liste_adt

вернет правильный ответ, но я не знаю, что использовать, потому что __in__ не работает.

Спасибо,

Ответы [ 2 ]

11 голосов
/ 24 февраля 2012

Вы ищете __contains__?

object.__contains__(self, item)

Вызывается для реализации операторов проверки членства. Должен возвращать true, если item находится в self, false в противном случае. Для объектов сопоставления следует учитывать ключи сопоставления, а не значения или пары ключ-элемент.

Для объектов, которые не определяют __contains__(), тест членства сначала пытается выполнить итерацию с помощью __iter__(), затем старый протокол итерации последовательности через __getitem__(), см. этот раздел в справочнике по языку .

Быстрый пример:

>>> class Bar:
...     def __init__(self, iterable):
...         self.list = list(iterable)
...     def __contains__(self, item):
...         return item in self.list
>>>     
>>> b = Bar([1,2,3])
>>> b.list
[1, 2, 3]
>>> 4 in b
False
>>> 2 in b
True

Примечание: Обычно, когда у вас возникают подобные сомнения, ссылки можно найти в разделе Модель данных раздела Справочник по языку Python .

1 голос
/ 24 февраля 2012

Поскольку структура данных представляет собой связанный список, необходимо выполнить итерации по нему, чтобы проверить членство. Реализация метода __iter__() заставит работать и if in, и for in. Если есть более эффективный способ проверки членства, используйте это в __contains__().

...