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


197

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

class MyClass(object):
    ...

m = MyClass()

if 54 in m:
    ...

Я был на самом деле поиск , как переопределить 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, ваш код может быть «более полным» с точки зрения кода, но ссылки Игнасио на документацию, что всегда является большим плюсом для некоторых.
— Питер Хансен

16
@Питер. Да, но некоторые из нас предпочитают хорошее визуальное представление ответа. Игнасио мало что сделал, чтобы ответить на этот вопрос, кроме того, что сначала направил нас сюда вместо Google, нет, спасибо.
— Зоран Павлович

Зоран, я согласен, и я даже проголосовал за этот ответ, а не за другой. Я просто указываю, что действительно хороший ответ всегда должен быть связан с документами, если таковые имеются.
— Питер Хансен

13
Все, ссылки умирают, и поэтому ответ Игнасио шаток на SO. Ссылки + пример - лучший, и поэтому комбинация двух ответов, о которых мы говорим, является лучшей.
— demongolem

1
@demongolem Официальная документация Python умрет с или после того, как переводчик станет недоступным для загрузки. И это не только ответ по ссылке; Я пришел на эту страницу в поисках ответа и нашел его, не нажимая на дальнейшие ссылки (т.е. прототип был достаточным). Я согласен в принципе, но имхо, что здесь не применимо.
— wizzwizz4

7

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.