Как определить «в» для класса Python - PullRequest
0 голосов
/ 15 мая 2018

Если бы у меня был список некоторого класса python, у которого было строковое поле, есть ли способ сравнить строку со списком объектов этого класса, используя in? Мне было любопытно, есть ли способ сделать что-то вроде этого:

class Foo:
    def __init__(self, s):
        self.s = s

bar = Foo('test')
ls = [bar]

if 'test' in ls:
    print("Yay!")

путем изменения метода __eq__, или, может быть, даже есть метод __in__, о котором я не знаю

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Ваша интуиция по поводу определения кастома __eq__ была верна. Вы можете достичь следующего, что, по-видимому, является вашей целью здесь:

>>> class Foo:
...     def __init__(self, s):
...         self.s = s
...     def __eq__(self, other):
...         if isinstance(other, Foo):
...             return self.s == other.s
...         else:
...             return self.s == other
...
>>>
>>> bar = Foo('bar')
>>> l = [bar]
>>> bar in l
True
>>> 'bar' in l
True
>>> Foo('baz') in l
False
>>> 'baz' in l
False

Я также хочу отметить, что существует метод __contains__, который позволяет вам определять поведение оператора членства (in). Однако это метод типа контейнера, поэтому определение этого метода для вашего класса Foo ничего бы не сделало, поскольку in применяется к списку, а не к его отдельным элементам.

0 голосов
/ 15 мая 2018

Ваше предположение об изменении __eq__ верно.Это определенно один из способов сделать это.Вам просто нужно проверить значение аргумента __eq__ с соответствующим атрибутом вашего объекта.Таким образом, в качестве очень простого способа вы можете реализовать что-то вроде следующего:

In [1]: class Foo:
   ...:     def __init__(self, s):
   ...:         self.s = s
   ...:
   ...:     def __eq__(self, value):
   ...:         return self.s == value
   ...:     

In [2]: bar = Foo('test')
   ...: ls = [bar]
   ...: 

In [3]: 'test' in ls
Out[3]: True

Обратите внимание, что этот метод __eq__ не имеет никаких ограничений, таких как проверка типов или какая-либо другая обработка ошибок.Если вы считаете, что они необходимы в вашем случае, вы можете рассмотреть возможность использования try-excep и других проверок условий.

Демо:

In [9]: foo = Foo('test')

In [10]: bar = Foo('test')

In [11]: ls = ['test']

In [12]: bar in ls
Out[12]: True

In [13]: ls = [bar]

In [14]: foo in ls
Out[14]: True
...