繁体   English   中英

如何为python类定义“in”

[英]How to define “in” for a python class

如果我有一些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__猜测是正确的。 这绝对是一种方法。 您只需要使用对象的相应属性检查__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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM