实现__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
相关产品推荐
相关产品推荐

