为何Python中!=运算符未调用自定义的__neq__方法?
问题分析与解决
这个问题的核心原因很简单——你把不等于运算符对应的魔法方法名写错了!Python中,对应!=运算符的魔法方法是__ne__,而不是你写的__neq__,这就是自定义逻辑没生效的关键。
为什么会出现这个问题?
当你执行a != b时,Python会优先尝试调用a.__ne__(b)来判断结果。但你的类里并没有定义__ne__方法,Python就会 fallback 到继承自str类的默认__ne__实现,而不是你写的__neq__(这个方法根本不会被Python的运算符调度逻辑识别),所以结果完全不符合预期。
另外补充一点:Python 3已经彻底废弃了__cmp__方法,你定义的这个方法不会被任何比较逻辑调用,完全可以删掉。
修正后的代码
class A(str): def __eq__(self, o): # 直接判断是否为str类型,逻辑更清晰 return isinstance(o, str) def __ne__(self, o): # 基于__eq__的结果取反,保持逻辑一致性 return not self.__eq__(o) a = A() b = 'a' print(a == b) # 输出 True,符合预期 print(a != b) # 输出 False,符合预期
额外说明
其实在大多数情况下,如果你只重写了__eq__,Python会自动生成默认的__ne__实现(逻辑就是not self.__eq__(other))。不过因为你继承自str这种内置不可变类型,明确重写__ne__可以避免一些潜在的意外行为,让代码逻辑更清晰。
内容的提问来源于stack exchange,提问作者user1477337
相关产品推荐
相关产品推荐

