You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:24:52