如何覆盖日期时间。日期时间并将其保留为datetime.d实例

2024-04-26 19:14:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我们写了一个日期时间。日期时间以及datetime.date日期(见下文)

TEST_TIME_DELTA = datetime.timedelta(seconds=0)

class TimeTravelDateTime(datetime.datetime):
    @classmethod
    def now(cls,*args, **kwargs):
        return super(TimeTravelDateTime,cls).now(*args, **kwargs) +  globals()["TEST_TIME_DELTA"]

    @classmethod
    def utcnow(cls, *args, **kwargs):
        return super(TimeTravelDateTime, cls).utcnow(*args, **kwargs) + globals()["TEST_TIME_DELTA"]


    @classmethod
    def today(cls, *args, **kwargs):
        return super(TimeTravelDateTime, cls).today(*args, **kwargs) + globals()["TEST_TIME_DELTA"]

class TimeTravelDate(datetime.date):
    @classmethod
    def today(cls, *args, **kwargs):
        return super(TimeTravelDate, cls).today(*args, **kwargs) + globals()["TEST_TIME_DELTA"]

然后我们做了以下工作

sys.modules['datetime'].datetime = TimeTravelDateTime
sys.modules['datetime'].date = TimeTravelDate

但是我们的代码现在每次尝试将relativedelta添加到datetime.datetimes因为在relativedelta add方法的代码中,有一个检查:

if not isinstance(other, datetime.date):
    raise TypeError("unsupported type for add operation") 

其他人在哪里datetime.datetime.today今天(). 默认情况下,日期时间。日期时间是的实例datetime.date日期. 另外,如果我们只覆盖日期时间。日期时间,那么datetime.datetime.today今天()仍然是datetime.date日期. 即使类型(datetime.datetime.today今天()) = 日期时间。日期时间你知道吗

但我们的覆盖datetime.date日期,isinstance检查不再通过。你知道吗

如果我们只覆盖日期时间。日期时间,但一旦我们覆盖datetime.date日期,一切都会下地狱。你知道吗

如何覆盖datetime.date日期以便日期时间。日期时间仍然是datetime.date日期. 也就是说,从这里保持子类关系https://docs.python.org/2/library/datetime.html#available-types(向下滚动一点)。


Tags: testtodaydatetimedatereturntimedef时间