社区首页 >问答首页 >避免在同一类的许多实例中重复数据

避免在同一类的许多实例中重复数据
EN

Stack Overflow用户
提问于 2017-07-21 00:00:03
回答 1查看 55关注 0票数 1

我正在对datetime.datetime类进行子类化,以尝试添加一些基于日历的操作。特别是,我希望能够从锚定日期中增加/减去天数/周/月/年,同时对周末和银行假日进行调整。

下面是一个应该涵盖该方法的片段:

代码语言:javascript
代码运行次数:0
复制
import datetime
import dateutil

class DateTime(datetime.datetime):
    def add_workdays(cls, n = 1):
        x = 1
        while x <= n:
            cls += dateutil.relativedelta.relativedelta(days=1)
            if cls.weekday() > 4:
                x = x
            else:
                x += 1
        return DateTime(cls.year, cls.month, cls.day, cls.hour, cls.minute,
                        cls.second, cls.microsecond)

此方法会将n个工作日(仅计算周末)添加到当前日期,并返回结果。

为了完成银行假日更正,我可以简单地将一个包含银行假日的数组(通过setter方法或通过重写__new__方法)传递给该方法并进行相应的调整。然而,当考虑到时间序列数据时,问题就会发生.在这种情况下,每个datetime对象将包含所述数组的副本,我怀疑这会使内存在长时间序列数据中的使用率相当高。

所以我的问题是:复杂的Python程序员将如何处理这个问题?我一直在研究双日包实现这一点的方式,但它似乎也有同样的“缺点”。

在其他语言中,我本可以简单地指向假日数组的单个实例,但我(诚然是稀疏的) Python知识,这是不可能的。仅仅在需要时将日期存储为字符串并转换为DateTime更正确吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-21 00:09:38

您可以简单地在类定义中添加一个变量:

代码语言:javascript
代码运行次数:0
复制
import datetime

class DateTime(datetime.datetime):
    holidays = [datetime.date(2017, 7, 4), datetime.date(2017,12,25)] # ....

print(DateTime.holidays)
# [datetime.date(2017, 7, 4), datetime.date(2017, 12, 25)]

它在任何地方都可以使用,包括在任何DateTime实例中。对于所有实例,只有一个副本:

代码语言:javascript
代码运行次数:0
复制
import datetime

class DateTime(datetime.datetime):
    holidays = [datetime.date(2017, 7, 4), datetime.date(2017,12,25)] # ....

    def test_only_one_copy_of_holidays(self): # Only defined for testing purposes
        return DateTime.holidays

holidays1 = DateTime(2017,7,21).test_only_one_copy_of_holidays()
holidays2 = DateTime(2017,7,30).test_only_one_copy_of_holidays()

print(holidays1 is holidays2) # Are they the same object?
# True

对于多个国家,您可以使用dict of lists:

代码语言:javascript
代码运行次数:0
复制
>>> import datetime
>>> holidays = {'France': [datetime.date(2017,7,14), datetime.date(2017,12,25)], 'USA': [datetime.date(2017,7,4), datetime.date(2017,12,25)]}
>>> holidays['USA']
[datetime.date(2017, 7, 4), datetime.date(2017, 12, 25)]
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45232216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文