Вопрос проверяет понимание того, как Python реализует оператор проверки принадлежности in.
Метод __contains__ используется для проверки наличия элемента в контейнере при использовании оператора in. Если метод реализован, Python вызывает его напрямую. Если его нет, Python пытается итерироваться по объекту и сравнивать элементы. Реализация __contains__ обычно делает проверку быстрее.
Когда выполняется выражение:
x in obj
Python делает следующее:
Пытается вызвать obj.__contains__(x)
Если метода нет, итерируется по объекту
Сравнивает элементы один за другим
class MyCollection:
def __init__(self, items):
self.items = items
def __contains__(self, value):
return value in self.items
Теперь:
c = MyCollection([1, 2, 3])
print(2 in c) # True
Явная реализация __contains__ полезна, когда:
можно выполнить проверку быстрее, чем полный перебор
есть индекс или хеш-структура
объект не является последовательностью
Например, множества используют хеш-таблицу, поэтому поиск работает быстро.
Метод __contains__ управляет поведением оператора in. Его реализация позволяет ускорить проверку принадлежности и явно определить логику поиска внутри контейнера.