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

实现__eq__函数时,是否应加入is关键字的对象同一性检测?

在Python中实现__eq__时,是否该加入is同一性检测?

这绝对是个非常务实的好问题!答案是:非常推荐把is关键字的对象同一性检测作为__eq__实现的第一步,原因主要有两点:

1. 极致的性能优化

is检测是Python中最快的判断之一——它直接比较对象的内存地址,属于O(1)操作。如果两个变量指向同一个实例(比如你说的S = U的场景),self is other会瞬间返回True,完全跳过后续可能耗时的属性比对逻辑。
尤其是当你的类包含大量属性、或者属性本身是需要递归比对的复杂对象时,这一步能帮你节省不少不必要的计算开销。

2. 逻辑上的合理性

如果两个对象是同一个实例,那它们的所有属性必然完全一致(毕竟是同一个东西),此时==返回True完全符合我们对“相等”的预期。这一步检测相当于提前过滤掉“完全没必要继续比对”的情况,让代码逻辑更清晰。

完整的示例实现

这里给你一个标准的__eq__实现模板,包含同一性检测、类型校验和属性比对:

def __eq__(self, other):
    # 第一步:快速判断是否为同一实例
    if self is other:
        return True
    # 第二步:校验类型是否匹配,避免跨类型错误比对
    if not isinstance(other, self.__class__):
        return False
    # 第三步:比对核心属性(根据你的类需求调整)
    return self.name == other.name and self.value == other.value

小提醒

  • 一定要把is检测放在最前面,不然就失去了性能优化的意义;
  • 类型校验也很重要,比如避免你的类实例和一个完全无关的类实例被错误判定为相等;如果你想支持子类实例的相等判断,可以把isinstance(other, self.__class__)改成type(other) is type(self)或者根据需求调整。

内容的提问来源于stack exchange,提问作者Elmex80s

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:22:28