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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 18:00:02