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