Python类实例化时默认参数为当前UTC时间未实时更新的问题咨询
为什么__init__的默认参数不会每次实例化都重新计算?
这是Python里一个经典的“新手坑”,原因其实很好理解:函数(包括类的__init__方法)的默认参数值是在函数被定义的那一刻就计算并固定下来的,而不是每次调用函数时重新计算。
回到你的代码里,当你写下def __init__(self, time = datetime.datetime.utcnow()):这一行时,Python会立刻执行datetime.datetime.utcnow(),把返回的时间对象存在这个默认参数的位置。不管你之后隔多久创建Timer的实例,只要不传入time参数,就会直接用这个提前计算好的旧时间,不会再去调用utcnow()。
举个直观的例子:你先创建a = Timer(),过10分钟再创建b = Timer(),会发现两个实例的time完全一样——就是你定义Timer类那一刻的时间。
要解决这个问题,标准做法是把默认参数设为None,然后在__init__方法内部动态计算当前时间:
import datetime class Timer: def __init__(self, time=None): # 若未传入time参数,实时获取当前UTC时间 if time is None: time = datetime.datetime.utcnow() self.time = time print('Instance created at', self.time)
这样一来,每次创建实例时,只要没传time,都会在__init__执行时重新调用utcnow(),得到的就是实例创建那一刻的时间了。
内容的提问来源于stack exchange,提问作者Pythonist
相关产品推荐
相关产品推荐

