Python中通过实现__eq__方法可自定义对象相等逻辑,需返回布尔值、处理类型检查并返回NotImplemented;若重写__eq__,通常也应重写__hash__以保持相等对象哈希值一致。

Python中对象默认使用id()(即内存地址)判断是否相等,但通过实现__eq__方法,可以自定义两个实例“逻辑上是否相等”的规则。
__eq__ 方法的基本写法
当类定义了__eq__,Python会在使用==时自动调用它。该方法接收两个参数:self和other,需返回True或False。
- 必须显式返回布尔值,不能只写条件表达式而不加
return - 建议先检查
other类型,避免与不兼容类型比较时报错 - 若
other不是本类实例,通常返回NotImplemented(不是NotImplementedError),让Python尝试调用other.__eq__(self)或回退到默认行为
常见错误与注意事项
忽略__eq__的对称性和一致性,容易引发意外结果。
- 不要在
__eq__中修改对象状态(如赋值、调用可变操作) - 若重写了
__eq__,通常也应重写__hash__(除非明确不希望实例被用作字典键或集合元素) -
==和is语义不同:is永远比较身份(id),==才走__eq__
配合 __hash__ 保持一致性
如果对象参与哈希运算(比如放进set或作为dict的键),而你又重写了__eq__,那么:
立即学习“Python免费学习笔记(深入)”;
- 相等的对象(
a == b为True)必须有相同的hash(a) == hash(b) - 若自定义了
__eq__且对象是不可变的,可定义__hash__返回基于关键属性的哈希值 - 若对象是可变的,通常应将
__hash__ = None,表示不可哈希
一个实用示例
定义一个表示二维点的类,按坐标值判断是否相等:
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def __eq__(self, other):
if not isinstance(other, Point):
return NotImplemented
return self.x == other.x and self.y == other.y
def __hash__(self):
return hash((self.x, self.y))
这样Point(1, 2) == Point(1, 2)返回True,且能放入set中去重。










