如何模拟python中的“+”运算符(特别是日期时间.日期+ 日期时间。时间增量)

2024-10-04 11:24:44 发布

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

我在Django中处理了一些日期模拟问题,最后的障碍(我希望)是以下情况。我有一个FakeDate类,它从datetime.date派生,它模拟了这个类。在

FakeDate类按预期工作,但是我在向FakeDate添加datetime.timedelta时遇到一个问题,因为它返回一个真正的datetime.date,而不是mock。这一点很重要,因为在第三方库的其他地方有一个isinstance(value, datetime.date)检查,在使用timedelta时总是失败。在

>>> import mock
>>> import datetime
>>>
>>> class FakeDate(datetime.date):
...     @classmethod
...     def today(cls):
...         return cls(1999, 12, 31)
...
>>> FakeDate.today()
FakeDate(1999, 12, 31)
>>> FakeDate(2000, 1, 1)
FakeDate(2000, 1, 1)
>>> FakeDate(1999, 12, 31) + datetime.timedelta(days=1)
datetime.date(2000, 1, 1)

我希望FakeDate+timedelta加法返回FakeDate对象而不是日期时间.日期对象-我想这需要某种方式修补时间差-但我该如何/在哪里可以做到呢?在


Tags: 对象djangoimporttodaydatetimedatevalue地方
2条回答

__add__方法添加到FakeDate()类:

class FakeDate(datetime.date):
     @classmethod
     def today(cls):
         return cls(1999, 12, 31)
     def __add__(self, other):
         res = super(FakeDate, self).__add__(other)
         return type(self)(res.year, res.month, res.day)

演示:

^{pr2}$

{{cd2>我们只需添加一个实例就可以了。在

你只需要在你的FakeDate类中定义一个__add__方法它是控制+操作符行为的方法。在

import datetime

class FakeDate(datetime.date):
    @classmethod
    def today(cls):
        return cls(1999, 12, 31)

    def __add__(self, delta):
        # Create a datetime.date object so we don't need to do any calculations
        new_date = super(FakeDate, self).__add__(delta)
        # Then convert it to FakeDate.
        return FakeDate(new_date.year, new_date.month, new_date.day)

# Returns a FakeDate for 2000-01-01
FakeDate.today() + datetime.timedelta(days=1)

注意,这只处理fakedate + timedelta情况。如果您希望timedelta + fakedate也返回FakeDate的实例,那么还需要定义__radd__方法(与__add__相同的代码)。在

有关与运算符关联的__magic_methods__的详细信息,请参见http://docs.python.org/2/reference/datamodel.html#emulating-numeric-types。在

相关问题 更多 >