讲师中心 微信公众号
AI工具推荐 视频效率加速

Python 如何让 eq 只在同类型对象间比较才有意义

胖浩小哥_6604

胖浩小哥_6604

发布时间:2026-01-16 22:16:02

|

490人浏览过

|

来源于php中文网

原创

应返回NotImplemented而非False,以支持Python反射机制;需用isinstance(other, self.__class__)检查类型兼容性,再比较属性;重写__eq__时须同步定义__hash__确保一致性。

python 如何让 eq 只在同类型对象间比较才有意义

在 Python 中,让 __eq__ 方法只对同类型对象返回有意义的比较结果(即不同类型的对象直接返回 NotImplemented,而非 False),是实现安全、符合 Python 惯例的相等性判断的关键做法。

为什么不能直接返回 False?

直接在 __eq__ 中对不同类型返回 False 会破坏 Python 的运算符反射机制。当 a == b 执行时,Python 先调用 a.__eq__(b);如果它返回 NotImplemented,解释器会尝试调用 b.__eq__(a)(若存在)。若某一方返回 False,比较就提前终止,可能导致内置类型或第三方类无法正确参与比较(比如 MyClass() == 42 返回 False,但 42 == MyClass() 可能本应由 int.__eq__ 处理并返回 NotImplemented 后失败——而你的 False 干扰了这一流程)。

正确做法:用 isinstance 检查类型,不匹配则返回 NotImplemented

在 __eq__ 中,先检查另一个对象是否为**当前类的实例**(或至少是兼容的类型),否则返回 NotImplemented:

python-parallelization
python-parallelization

将顺序 Python 代码转换为并行/并发实现,用于在需要并行化 Python 代码、提升性能时使用。

下载

(注意:不是 type(self) == type(other),因为这会拒绝子类实例;通常用 isinstance(other, self.__class__) 更合理)

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

  • 使用 isinstance(other, self.__class__) 判断是否为同类或子类实例(推荐,支持继承)
  • 若需严格限制为同一类(禁止子类),可用 type(other) is type(self)
  • 确认类型后,再比较关键属性(如 self.x == other.x and self.y == other.y)
  • 类型不匹配时,必须返回 NotImplemented(不是 False,也不是抛异常)

完整示例

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y
<pre class="brush:php;toolbar:false;">def __eq__(self, other):
    if not isinstance(other, self.__class__):
        return NotImplemented
    return self.x == other.x and self.y == other.y

效果:

p1 = Point(1, 2) p2 = Point(1, 2) print(p1 == p2) # True print(p1 == (1, 2)) # NotImplemented → 最终返回 False(由解释器兜底) print((1, 2) == p1) # 元组的 eq 不认识 Point,返回 NotImplemented → 最终 False

进阶提示:配合 __hash__ 保持一致性

如果重写了 __eq__,且对象需放入 set 或作字典键,通常也要定义 __hash__。若 __eq__ 依赖某些属性,则 __hash__ 应仅基于这些**不可变属性**计算,并确保相等对象有相同哈希值。同时,若你允许子类实例参与比较,要注意子类可能修改属性逻辑,此时可考虑将 __hash__ 设为 None(禁用哈希)以避免风险。

热门AI工具

更多
Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

2800

2023.09.27

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

249

2026.02.03

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6024

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2844

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

1752

2025.10.17

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6024

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2844

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

1752

2025.10.17

Revel框架入门与安装配置
Revel框架入门与安装配置

本专题从Revel框架环境搭建讲起,系统介绍命令行工具安装、项目创建、目录结构、配置文件及热代码重载,帮助开发者快速完成首个Go Web应用。

0

2026.10.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn