以下是子类化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