如何为 python 类定义"in"



如果我有一个带有字符串字段的 python 类的列表,有没有办法使用in将字符串与该类的对象列表进行比较?我很好奇是否有办法做这样的事情:

class Foo:
def __init__(self, s):
self.s = s
bar = Foo('test')
ls = [bar]
if 'test' in ls:
print("Yay!")

通过修改__eq__方法,甚至可能有一个我不知道的__in__方法

你对定义自定义__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应用于列表,而不是其单个项。

你对修改__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

相关内容

最新更新