Python中如何正确重写__eq__方法实现自定义类实例相等判断
问题原因
- 核心错误是
__eq__方法的实现逻辑完全错误:你写的return self == other会触发无限递归调用__eq__方法,因为==运算符本身就会触发实例的__eq__执行,相当于在方法内部循环调用自身,正常运行会直接抛出栈溢出错误,你当前得到False属于异常运行结果。 - 如果没有重写
__eq__,Python默认对自定义类实例做相等判断时会对比内存地址,你创建的两个属性完全一致的实例属于不同内存对象,默认判断也会返回False。
修复方案
替换你的__eq__方法为以下实现即可:
def __eq__(self, other): # 先校验对比对象是否为当前类的实例 if not isinstance(other, LedgerTransaction): return False # 逐一比对三个核心属性 return ( self.date == other.date and self.payee == other.payee and self.amount == other.amount )
可选优化
你的测试代码可以简化为更符合Python语法的写法,不需要直接调用魔术方法:
def test_eq_LedgerTransaction(transaction, equal_transaction, other_transaction): assert transaction == equal_transaction assert transaction != other_transaction
注意:如果业务中
amount字段存在浮点数精度问题,建议不要直接用==做相等判断,可以改为abs(self.amount - other.amount) < 1e-9这类阈值判断逻辑,避免精度误差导致判断错误。
内容的提问来源于stack exchange,提问作者jjk
相关产品推荐
相关产品推荐

