You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何子类化datetime.date会改变__eq__方法的比较结果?

子类化datetime.date为何会改变__eq__的比较结果?

按预期,datetime与date对象永远不应相等,但子类化date后出现了不符合预期的结果:

测试代码

from datetime import datetime, date

class MyDate(date):
    pass

print(MyDate(2024, 3, 8) == datetime(2024, 3, 8))
print(date(2024, 3, 8) == datetime(2024, 3, 8))

预期输出

False
False

实际输出

True
False

原因解析

核心在于Python内置date和datetime的__eq__方法实现逻辑,以及子类继承后的方法调用规则:

  • datetime是date的子类:isinstance(datetime(2024,3,8), date)返回True,这是一切的基础。
  • 原生date与datetime的比较逻辑:内置date的__eq__由C语言实现,它会特殊处理datetime类型——当比较date和datetime时,直接返回NotImplemented,触发Python调用datetime的__eq__方法。而datetime的__eq__要求比较双方必须都是datetime实例,因此返回False。
  • 自定义MyDate子类与datetime的比较逻辑:MyDate继承了date的__eq__方法,但内置date的C实现仅对原生date和datetime的比较做特殊判断;对于自定义子类的实例,只会检查对方是否是date的实例(datetime满足这个条件),然后直接比较年月日字段。由于两者的日期部分完全一致,因此返回True,不会触发datetime的__eq__方法调用。

内容的提问来源于stack exchange,提问作者no step on snek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 12:25:12