避免在同一个班级的许多实例中重复数据

时间:2017-07-21 08:00:03

标签: python

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

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

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__方法)传递给方法并进行相应调整。但是,在考虑例如时间序列数据时会出现问题。在这种情况下,每个日期时间对象都将包含所述数组的副本,我怀疑,这可能会使长时间序列数据的内存使用量非常高。

所以我的问题是:复杂的Python程序员将如何处理这个问题?我一直在研究bizdays套餐实现这一目标的方式,但它似乎也遭受了同样的缺点和#34;。

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

1 个答案:

答案 0 :(得分:3)

您只需在类定义中添加一个变量:

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实例中。所有实例只有一个副本:

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使用list s:

>>> 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)]