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



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

所以我的问题是:复杂的Python程序员将如何处理这个问题?我一直在研究 bizdays 软件包实现这一目标的方式,但它似乎也存在同样的"缺点"。

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

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

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

对于多个国家/地区,您可以使用lists 的dict

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

相关内容

最新更新