繁体   English   中英

如何覆盖datetime.datetime并将其保留为datetime.date的实例

[英]How to overwrite datetime.datetime and keep it instance of datetime.date

我们覆盖了datetime.datetime和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

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

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

其他是datetime.datetime.today()。 默认情况下,datetime.datetime是datetime.date的实例。 另外,如果我们覆盖datetime.datetime,则datetime.datetime.today() 仍然是datetime.date的实例。 即使type(datetime.datetime.today())= datetime.datetime

但是随着我们对datetime.date的覆盖,isinstance检查不再通过。

如果我们仅覆盖datetime.datetime,则此方法有效,但是一旦覆盖datetime.date,一切都会陷入困境。

我们如何覆盖datetime.date,以便datetime.datetime仍然是datetime.date的实例。 即。 保持此处的子类关系https://docs.python.org/2/library/datetime.html#available-types (向下滚动一点)。

我们只使用了freezegun软件包,并使用该https://github.com/spulec/freezegun重构了我们的测试

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM