Переопределить оператор Python «in»?

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

class MyClass(object):
    ...

m = MyClass()

if 54 in m:
    ...

person astrofrog    schedule 07.02.2010    source источник
comment
На самом деле я искал, как переопределить операторы is и is not. Как query = tinydb.Query().field == value, чтобы также иметь возможность писать Query().field is not None. Но, похоже, пока что у меня остались __eq__ и __ne__, что приводит к непифоническому Query().field != None. (сарк)   -  person Tomasz Gandor    schedule 13.06.2017


Ответы (3)


MyClass.__contains__(self, item)

person Ignacio Vazquez-Abrams    schedule 07.02.2010

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

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__.

person pthulin    schedule 07.02.2010
comment
@pthulin, ваш может быть более полным с точки зрения кода, но ссылки Игнасио на документацию всегда являются большим плюсом для некоторых. - person Peter Hansen; 08.02.2010
comment
@Питер. Да, но некоторые из нас предпочитают красивое визуальное представление ответа. Игнасио мало что сделал для решения вопроса, кроме как сначала направить нас сюда вместо Google, нет, спасибо. - person Zoran Pavlovic; 03.07.2012
comment
Зоран, я согласен, и я даже проголосовал за этот ответ, а не за другой. Я просто указываю, что действительно хороший ответ всегда должен ссылаться на документы, если они доступны. - person Peter Hansen; 01.09.2012
comment
Все, ссылки умирают, и поэтому ответ Игнасио на SO шаткий. Ссылки + пример лучше всего, и поэтому лучше всего сочетать два ответа, о которых мы говорим. - person demongolem; 05.12.2012
comment
@demongolem Официальная документация Python умрет вместе с интерпретатором или после того, как его нельзя будет загрузить. И это не ответ только по ссылке; Я пришел на эту страницу в поисках ответа и нашел его, не нажимая никаких дополнительных ссылок (т.е. прототипа было достаточно). В принципе согласен, но имхо это не применимо. - person wizzwizz4; 08.04.2017

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

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

person user250828    schedule 08.02.2010