Переопределить оператор 'in' в Python?

197

Если я создаю свой собственный класс в Python, какую функцию я должен определить, чтобы разрешить использование оператора «in», например

class MyClass(object):
    ...

m = MyClass()

if 54 in m:
    ...
astrofrog
источник
Я был на самом деле поиск , как переопределить isи is notоператор. Как query = tinydb.Query().field == value, чтобы также иметь возможность писать Query().field is not None. Но, кажется, я остался на время __eq__и на __ne__какое-то время, что ведет к непифонии Query().field != None. (сарка)
Томаш Гандор

Ответы:

191

Более полный ответ:

class MyClass(object):

    def __init__(self):
        self.numbers = [1,2,3,4,54]

    def __contains__(self, key):
        return key in self.numbers

Здесь вы получите True, когда спросите, было ли 54 в m:

>>> m = MyClass()
>>> 54 in m
True  

Смотрите документацию по перегрузке__contains__ .

pthulin
источник
@pthulin, ваш код может быть «более полным» с точки зрения кода, но ссылки Игнасио на документацию, что всегда является большим плюсом для некоторых.
Питер Хансен
16
@Питер. Да, но некоторые из нас предпочитают хорошее визуальное представление ответа. Игнасио мало что сделал, чтобы ответить на этот вопрос, кроме того, что сначала направил нас сюда вместо Google, нет, спасибо.
Зоран Павлович
Зоран, я согласен, и я даже проголосовал за этот ответ, а не за другой. Я просто указываю, что действительно хороший ответ всегда должен быть связан с документами, если таковые имеются.
Питер Хансен
13
Все, ссылки умирают, и поэтому ответ Игнасио шаток на SO. Ссылки + пример - лучший, и поэтому комбинация двух ответов, о которых мы говорим, является лучшей.
demongolem
1
@demongolem Официальная документация Python умрет с или после того, как переводчик станет недоступным для загрузки. И это не только ответ по ссылке; Я пришел на эту страницу в поисках ответа и нашел его, не нажимая на дальнейшие ссылки (т.е. прототип был достаточным). Я согласен в принципе, но имхо, что здесь не применимо.
wizzwizz4
7

Возможно, вы также захотите взглянуть на инфраструктуру переопределения инфиксных операторов, которую я смог использовать для создания языка для конкретного домена:

http://code.activestate.com/recipes/384122/

user250828
источник