网易首页 > 网易号 > 正文 申请入驻

Python:比较协议

0
分享至

比较协议(Rich Comparison Protocol)是 Python 在处理大小比较与相等性判断时所遵循的一套核心规则。它规定了解释器在遇到 a < b、a == b、a >= b 等比较语法时,应当如何判定参与对象是否可以建立比较语义,以及在判定成立后,沿何种严格顺序展开执行路径。

理解比较协议,关键不在于记住若干特殊方法名,而在于把握一个更根本的逻辑:比较运算并不是对象主动执行的能力,而是解释器在比较语法语境下所采用的一套解释规则。

对象是否“可以比较”,并非其固有属性,而是解释器在特定语法结构中,对其类型结构应用比较协议后的判定结果。

一、什么是比较协议

在 Python 中,比较运算符包括:<、<=、>、>=、==、!= 等。

当解释器遇到如下语法:

a < b

它首先识别这是一次比较语法结构,然后触发比较协议解释路径。

比较协议是一套统一规则,但在不同运算符参与时,会沿不同的语义分支展开。例如“小于”与“相等”在语义层面并不等价,但它们共享同一协议分派模型。

比较协议并不是运行期实体,也不是某种接口类型。它存在于解释器的规则体系之中。

二、比较协议的方法构成

比较协议的核心方法共有六个,对应六种比较运算:

__ne__(self, other)   # !=

这些方法在类体执行阶段被创建为函数对象,并存储于类对象的字典中。它们不会因为名称特殊而自动生效。

比较协议不会通过通用属性查找路径(如 __getattribute__),而是由解释器直接读取类型对象的比较槽位结构(在 CPython 中对应 tp_richcompare)。

三、自定义比较语义(以小于为例)

比较协议允许用户通过定义特殊方法参与关系语义的建立。

例如:

使用:

print(s1 < s2)   # True

自定义比较并不是“给对象添加排序能力”,而是在比较语境(如 s1 < s2)中,为解释器提供一个可被选中的协议入口。

四、实例属性不会影响比较协议

与大多数协议一致,比较协议的判定发生在类型层面,而不是实例字典。

例如:

a < b   # TypeError

尽管实例 a 拥有名为 __lt__ 的属性,解释器在比较语境中不会通过普通属性访问机制进行判定,而是读取类型层的比较入口。

因此,比较能力来自类型结构,而非实例属性。

五、比较运算的严格分派顺序

以表达式:

a < b

为例,其解释路径如下:

1、若 type(a) 与 type(b) 不同,且 type(b) 是 type(a) 的真子类:

→ 按子类优先原则,优先尝试:

type(b).__gt__(b, a)

注意:对于 <,反向方法不是 __rlt__,而是 __gt__。因为 a < b 等价于 b > a。

2、若未触发子类优先规则,则进入标准正向路径:

type(a).__lt__(a, b)

3、若返回 NotImplemented,则尝试反向路径:

type(b).__gt__(b, a)

4、若仍返回 NotImplemented,抛出 TypeError。

(1)比较协议与数值运算协议一样,存在“对称协商机制”。不同的是,比较的对称性通过“对偶方法”实现,而非 r-方法命名体系。

(2)同样支持子类优先原则,右操作数的候选可能因子类关系而被优先提升。

因此,a < b 并不是简单调用某个方法,而是在比较语法语境下触发一次受规则控制的协议分派过程。

六、相等性比较的特殊性

相等运算,比如:

a == b

与大小比较不同,其失败处理方式具有特殊性。

解释路径为:

1、尝试 type(a).__eq__(a, b);

2、若返回 NotImplemented,尝试 type(b).__eq__(b, a);

3、若仍为 NotImplemented,则解释器退回到默认身份比较语义(等价于 a is b)。若两个对象身份相同,返回 True;否则返回 False。

因此,== 运算通常不会抛出 TypeError;若双方都不提供相等语义,则回退到比较对象身份。

这一点与 <、> 等运算不同,是比较协议中一个重要差异。

!= 的语义通常由 __ne__ 决定;若未实现 __ne__,则解释器通常会基于 __eq__ 的结果进行逻辑取反。

七、排序与比较协议

诸如:

sorted(iterable)

或列表的 .sort() 方法,本质上依赖比较协议中的 < 运算。

内部排序算法在比较两个元素时,解释器会触发 < 的比较协议路径。

因此,若对象未定义 < 语义或协商失败,排序操作将抛出 TypeError。

这再次说明,排序并不是对象“具有排序能力”,而是解释器在排序算法中反复触发比较协议。

八、比较协议的典型应用场景

比较协议贯穿多个核心语境:

1、条件判断(if / while)

2、排序与堆结构

3、集合与字典中的相等性判定(结合哈希协议)

4、去重与相等性判定

5、自定义数据结构的有序语义

这些场景的共同点在于:对象并未“执行比较”,而是在比较语法语境中被解释器按协议规则解释为可比较对象。

小结

比较协议不是对象模型中的实体,而是一组由解释器遵循的比较规则。它规定了解释器在比较语法语境中如何判定对象是否可比较、如何在类型结构中寻找语义入口,以及在协商失败时如何处理。对象是否“可比较”,并不取决于名称或类别标签,而取决于解释器在特定语境下对其类型结构应用比较协议后的结果。


点赞有美意,赞赏是鼓励

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
春节后首周行情启幕!三大板块有望逆袭,机会全解析

春节后首周行情启幕!三大板块有望逆袭,机会全解析

慧眼看世界哈哈
2026-02-21 11:02:29
不用猜,女人真正的软肋,就这7个地方

不用猜,女人真正的软肋,就这7个地方

青苹果sht
2026-02-19 07:48:00
骑士赢球后一点仍该批,哈登两点该夸!米切尔摊牌,新秀联盟第一

骑士赢球后一点仍该批,哈登两点该夸!米切尔摊牌,新秀联盟第一

鱼崖大话篮球
2026-02-21 11:30:30
实探春节北京“金市”:小克重饰品更受欢迎,老年人成买金条主力

实探春节北京“金市”:小克重饰品更受欢迎,老年人成买金条主力

时代周报
2026-02-20 16:30:34
今夜!史诗级利好!

今夜!史诗级利好!

中国基金报
2026-02-21 00:27:18
吴京没想到,镖人拿下单日票房第二,反超惊蛰无声,让他口碑逆转

吴京没想到,镖人拿下单日票房第二,反超惊蛰无声,让他口碑逆转

乡野小珥
2026-02-21 07:30:16
上海通河,房价从2015年23800涨到63800,如今价格回到真实价位

上海通河,房价从2015年23800涨到63800,如今价格回到真实价位

石辰搞笑日常
2026-02-21 10:45:00
这种此前全球未见活体的神秘生物,被我们在中国南海发现了

这种此前全球未见活体的神秘生物,被我们在中国南海发现了

果壳
2026-02-20 12:56:48
地产高薪神话破灭:郁亮年薪33.6万,打工皇帝跌落神坛

地产高薪神话破灭:郁亮年薪33.6万,打工皇帝跌落神坛

石头I侃房
2026-02-20 11:55:07
6场狂造6球 巴西神童新东家彻底爆发 4大英超豪门疯抢 皇马不放人

6场狂造6球 巴西神童新东家彻底爆发 4大英超豪门疯抢 皇马不放人

零度眼看球
2026-02-21 07:33:57
一周30万英镑,萨卡凭什么拿顶薪?曝阿森纳中场核心很不满

一周30万英镑,萨卡凭什么拿顶薪?曝阿森纳中场核心很不满

体育世界
2026-02-21 12:31:08
俄乌迎来大结局,泽连斯基没想到,为了停战,乌人民会这么积极

俄乌迎来大结局,泽连斯基没想到,为了停战,乌人民会这么积极

来科点谱
2026-02-21 07:07:34
广东宏远官宣!第二阶段外援阵容正式确定,杜锋豪赌

广东宏远官宣!第二阶段外援阵容正式确定,杜锋豪赌

林子说事
2026-02-21 12:45:05
党组织派她潜伏,给她二十根金条,她竟打三年麻将,输了个精光

党组织派她潜伏,给她二十根金条,她竟打三年麻将,输了个精光

妙知
2026-02-21 10:31:50
电影《飞驰人生3》 票房破19亿 导演韩寒:甘孜太美,被深深震撼

电影《飞驰人生3》 票房破19亿 导演韩寒:甘孜太美,被深深震撼

封面新闻
2026-02-20 22:25:23
春节旅游高峰已经爆出浆!大量现场游客动弹不得直呼后悔!

春节旅游高峰已经爆出浆!大量现场游客动弹不得直呼后悔!

魔都囡
2026-02-21 01:32:37
港媒台媒报道大盘点,标题犀利配图劲爆,文字一针见血想象力丰富

港媒台媒报道大盘点,标题犀利配图劲爆,文字一针见血想象力丰富

花哥扒娱乐
2026-02-20 19:25:54
狂砍33分还是输!哈登太稳了,至今难求一败!

狂砍33分还是输!哈登太稳了,至今难求一败!

德译洋洋
2026-02-21 12:58:13
Ai回答:我在自动取款机存200,我前面的人要取200,怎样更快?

Ai回答:我在自动取款机存200,我前面的人要取200,怎样更快?

必记本
2026-02-20 14:48:59
76年部队驻军村庄,临别房东女儿送5里路,退伍后我果断做出决定

76年部队驻军村庄,临别房东女儿送5里路,退伍后我果断做出决定

人间百态大全
2026-02-21 06:45:03
2026-02-21 14:03:00
MediaTea
MediaTea
专业的数字媒体、新媒体技术
1761文章数 77关注度
往期回顾 全部

科技要闻

智谱上市1月涨5倍,市值超越京东、快手

头条要闻

夫妇捡到装20多个红包帆布袋:4个孩子7万多的压岁钱

头条要闻

夫妇捡到装20多个红包帆布袋:4个孩子7万多的压岁钱

体育要闻

冬奥第一"海王"?一人和13国选手都有关系

娱乐要闻

镖人反超惊蛰无声拿下单日票房第二!

财经要闻

一觉醒来,世界大变,特朗普改新打法了

汽车要闻

比亚迪的“颜值担当”来了 方程豹首款轿车路跑信息曝光

态度原创

手机
游戏
时尚
旅游
教育

手机要闻

vivo产品线结构分析,走量最大的是这个档次

老任意外泄露重磅消息!《DOOM黑暗时代》或登NS2

2026纽约秋冬时装周,在春天开启美的新故事!

旅游要闻

可当天往返!郑州周边适合春节自驾游的7个好去处!

教育要闻

一个教师的2026年“不做清单”

无障碍浏览 进入关怀版