为什么在从timestamp中为方法指定参数tz时,datetime的子类不是子类的实例?

时间:2017-03-01 04:36:36

标签: python python-3.x datetime subclass isinstance

下面是datetime的子类示例代码。

由于pass是唯一的子类体,方法' __ new __'日期时间预计将保留。

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

问题是,为什么' a'当' b'是一个MyDatetime的实例。当它们仅仅通过参数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)== True,而isinstance(b,MyDatetime)== False?'

此处为type(a) == <class '__main__.MyDatetime'>,而type(b) == <class 'datetime.datetime'>

1 个答案:

答案 0 :(得分:0)

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