以下是子类化datetime的示例代码。

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

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

问题是,为什么“ a”不是MyDatetime的实例,而“ b”不是仅取决于参数tz的MyDatetime的实例,为什么呢?

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

#!/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)==真,而isinstance(b,MyDatetime)== False?”

这里是type(a) == <class '__main__.MyDatetime'>,而type(b) == <class 'datetime.datetime'>

最佳答案

tz中传递MyDatetime.fromtimestamp(dt, tz=timezone.utc)会调用tz.fromutc in the implementation,这将返回一个新的datetime对象,而忽略您已创建的实际子类。

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

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

10-08 18:16