如何为Python类实现in运算符,支持字符串与对象列表的包含判断
如何让字符串和自定义对象列表使用
in运算符进行比较? 当然可以实现你想要的效果!而且根本不存在什么__in__方法——Python的in运算符背后,是依赖容器的__contains__方法来工作的。对于列表来说,它的默认__contains__逻辑会逐个遍历列表元素,用==运算符比较元素和你要检查的值,所以只要给你的自定义类重写__eq__方法,就能达成目标。
默认情况下,自定义类的__eq__方法是比较对象的身份(也就是内存地址),所以你原来的代码里,'test' == bar会返回False,自然'test' in ls也不会触发打印。但重写__eq__后,我们可以定义自己的相等规则:
class Foo: def __init__(self, s): self.s = s def __eq__(self, other): # 先处理和字符串比较的情况 if isinstance(other, str): return self.s == other # 保留和同类型对象比较的逻辑 elif isinstance(other, Foo): return self.s == other.s # 其他类型直接返回不相等 return False bar = Foo('test') ls = [bar] if 'test' in ls: print("Yay!") # 现在这段代码会正常输出啦!
这里有个小细节要注意:重写__eq__时尽量考虑全面,比如要兼容和其他Foo对象的比较,还要处理和非字符串、非Foo类型的比较,避免出现意外的相等判断。另外,如果之后你需要把Foo对象放进集合或者作为字典的键,记得同时重写__hash__方法(比如返回hash(self.s)),因为Python要求相等的对象必须有相同的哈希值,不然会出现逻辑问题。
内容的提问来源于stack exchange,提问作者Zaya
相关产品推荐
相关产品推荐

