为何模块中datetime.now()固定为某时刻?如何动态更新时间戳?
问题分析与解决方案:动态获取类属性的时间戳
我来帮你拆解这个问题,其实本质是Python类属性的初始化时机导致的。
为什么时间戳始终不变?
当你导入test_mod模块时,模块内的所有代码会被一次性执行——包括Backup类的定义,以及Timestamp = datetime.now()这条赋值语句。也就是说,datetime.now()只在模块加载的那一刻运行了一次,把当时的时间戳赋值给了Backup.Timestamp这个类属性。之后不管你多少次访问这个属性,它都是当初那个固定的值,不会重新计算。
如何实现每次调用都更新时间戳?
我们需要让Timestamp每次被访问时都重新获取当前时间,最优雅的方式是用@classmethod结合@property,把它改成一个动态计算的类属性:
修改你的test_mod模块代码:
from datetime import datetime class Backup: @classmethod @property def Timestamp(cls): return datetime.now()
这样修改后,当你导入模块并调用test_mod.Backup.Timestamp时,每次访问都会触发datetime.now()的执行,返回最新的时间戳,而不是模块导入时的固定值。
原理很简单:
@classmethod让这个方法可以直接通过类(无需创建实例)调用;@property把方法伪装成属性的形式,保持了你原本想要的.Timestamp的简洁访问语法,同时每次访问都会重新执行方法逻辑。
如果你不介意用方法调用的形式,也可以简化成普通的类方法:
class Backup: @classmethod def get_timestamp(cls): return datetime.now()
调用时用test_mod.Backup.get_timestamp(),同样能每次获取最新时间,只是需要显式调用方法而非访问属性。
内容的提问来源于stack exchange,提问作者manoelpqueiroz
相关产品推荐
相关产品推荐

