Перевизначити оператор "in" Python?


199

Якщо я створюю власний клас у 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. (сарк)
Томаш

Відповіді:



194

Більш повна відповідь:

class MyClass(object):

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

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

Тут ви отримаєте правду, запитуючи, чи 54 в м:

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

Дивіться документацію про перевантаження__contains__ .


@pthulin, ваш може бути "більш повним" з точки зору коду, але посилання Ігнасіо на документацію, що завжди є великим плюсом для деяких.
Пітер Хансен

16
@PEter. Так, але деякі з нас віддають перевагу приємному, наочному зображенню відповіді. Ігнасіо мало що принесло користь питанню, окрім як спершу нас сюди замість Google, не дякую.
Зоран Павлович

Зоран, я згоден, і я навіть підтримав цю відповідь, а не іншу. Я просто вказую, що справді хороша відповідь завжди повинна посилатися на документи, якщо вони є.
Пітер Хансен

13
Усі посилання вмирають, і тому відповідь Ігнасіо хитнув на ТАК. Посилання + приклад найкращий, і саме тому найкраще поєднання двох відповідей, про які ми говоримо.
demongolem

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.