子类化datetime.datetime

时间:2014-07-26 02:02:08

标签: python datetime subclass python-datetime

我正在考虑创建一个python datetime-subclass,它在创建时提供默认时区。

为了简化这个问题,我们假设总是想要将我的日期时间硬编码为UTC。

我无法弄清楚以下原因:

import datetime, dateutil.tz

def foo(*args, **kwargs):
    kwargs['tzinfo'] = dateutil.tz.tzutc()
    return datetime.datetime(*args, **kwargs)

但以下情况并不奏效:

class Foo(datetime.datetime):
    def __init__(self, *args, **kwargs):
        kwargs['tzinfo'] = dateutil.tz.tzutc()
        super(Foo, self).__init__(*args, **kwargs)

运行第一个方法为我提供了我期望的日期时间对象:

>>> foo(2012, 11, 10)
datetime.datetime(2012, 11, 10, 0, 0, tzinfo=tzutc())
>>> foo(2012, 11, 10).tzinfo is None
False

但是创建一个Foo类的实例似乎并没有设置tzinfo对象。

>>> Foo(2012, 11, 10)
Foo(2012, 11, 10, 0, 0)
>>> Foo(2012, 11, 10).tzinfo is None
True

关于这里发生了什么的任何想法?

谢谢!

1 个答案:

答案 0 :(得分:0)

提供解决方案,如Why can't I subclass datetime.date?中所述,为了完整起见,感谢dano链接。

由于datetime对象是不可变的,因此必须在new中实现额外的功能:

class Foo(datetime.datetime):
    def __new__(cls, *args, **kwargs):
        kwargs['tzinfo'] = dateutil.tz.tzutc()
        return datetime.datetime.__new__(cls, *args, **kwargs)