为什么datetime的子类不是指定时间戳方法的参数tz的子类实例?

问题描述:

以下是日期时间子类的示例代码。为什么datetime的子类不是指定时间戳方法的参数tz的子类实例?

由于pass是唯一的子类体,所以datetime的方法'__new__'预计会被保留下来。

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

问题是,当'b'不是MyDatetime的一个实例时,为什么'a'是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)==假'

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

传递tzMyDatetime.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 
+0

是的,我看到还有通过查看源代码。是否有可能扩展答案,使日期时间可以通过获取感知日期时间对象的方式进行分类,例如https://docs.python.org/3/library/datetime.html#datetime.datetime .utcfromtimestamp datetime.fromtimestamp(timestamp,timezone.utc)?或者,如果提出一个新问题,那么对于*的原则呢? – paretech