Python对象比较规则_eq方法说明【指导】

14次阅读

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

Python对象比较规则_eq方法说明【指导】

Python中对象默认使用id()(即内存地址)判断是否相等,但通过实现__eq__方法,可以自定义两个实例“逻辑上是否相等”的规则。

__eq__ 方法的基本写法

当类定义了__eq__,Python会在使用==时自动调用它。该方法接收两个参数:selfother,需返回TrueFalse

  • 必须显式返回布尔值,不能只写条件表达式而不加return
  • 建议先检查other类型,避免与不兼容类型比较时报错
  • other不是本类实例,通常返回NotImplemented(不是NotImplementedError),让Python尝试调用other.__eq__(self)或回退到默认行为

常见错误与注意事项

忽略__eq__的对称性和一致性,容易引发意外结果。

  • 不要在__eq__中修改对象状态(如赋值、调用可变操作)
  • 若重写了__eq__,通常也应重写__hash__(除非明确不希望实例被用作字典键或集合元素)
  • ==is语义不同:is永远比较身份(id),==才走__eq__

配合 __hash__ 保持一致性

如果对象参与哈希运算(比如放进set或作为dict的键),而你又重写了__eq__,那么:

立即学习Python免费学习笔记(深入)”;

  • 相等的对象(a == bTrue)必须有相同的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中去重。

text=ZqhQzanResources