1

下面是子类日期时间的示例代码。

由于 pass 是唯一的子类主体,因此预计会保留 datetime 的方法“__new__”。

以下代码已在 Mac OS 10.12.3 上的 Python 3.4.2 和 Arch Linux 上的 Python 3.6.0 上进行了测试。在这两种情况下,结果相同。

问题是,为什么 'a' 是 MyDatetime 的一个实例,而 'b' 不是 MyDatetime 的一个实例,而它们仅在参数 tz 上有所不同?

感谢您的反馈意见。现在继续这个例子......

#!/usr/bin/env python3

from datetime import datetime
from datetime import timezone

class MyDatetime(datetime):
    pass

if __name__ == '__main__':
    dt = 1231798102

    a = MyDatetime.fromtimestamp(dt)
    b = MyDatetime.fromtimestamp(dt, tz=timezone.utc)

    print('Why is isinstance(a, MyDatetime) == {}, while isinstance(b, MyDatetime) == {}?'.format(isinstance(a, MyDatetime), isinstance(b, MyDatetime)))

上面的示例打印以下内容:'为什么 isinstance(a, MyDatetime) == True,而 isinstance(b, MyDatetime) == False?

这边type(a) == <class '__main__.MyDatetime'>,一会儿type(b) == <class 'datetime.datetime'>

4

1 回答 1

1

在实现tz中传入MyDatetime.fromtimestamp(dt, tz=timezone.utc)调用,它返回一个新对象,忽略您创建的实际子类。tz.fromutcdatetime

一,但我怀疑确保您的课程得到考虑的最有效方法:

class MyDatetime(datetime):
    @classmethod
    def fromtimestamp(cls, t, tz=None):
        result = super().fromtimestamp(t, tz)
        if tz:
            print(result.strftime("%s"))
            return super().fromtimestamp(int(result.strftime("%s")))
        return result
于 2017-03-01T05:29:06.393 回答