为何子类化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
相关产品推荐
相关产品推荐

