Python--timedelta对象何时被处理?
我有一个Django模型:
created=models.DateTimeField(auto_now_add=True)
现在我需要一个模型对象的方法,来显示从创建到现在经过了多少小时。我试过以下方法:
def hours_live(self):
diff=((datetime.datetime.now - self.created).seconds)/3600
return diff
但是出现了一个类型错误(TypeError)。
unsupported operand type(s) for -: 'builtin_function_or_method' and 'datetime.datetime'
然后我选择了这个:
def hours_live(self):
diff=((datetime.datetime.now() - self.created).seconds)/3600
return diff
我的问题是,datetime.datetime.now()这个表达式是在这里只执行一次,还是每次调用hours_live的时候都会执行?
这样做可以吗?
3 个回答
3
当然,每次调用 hours_live
时,它都会被执行,这就像普通的函数调用一样。
6
datetime.datetime.now
是一个方法。当你不加括号调用它时,其实是在指这个方法本身,而不是它的结果,所以你不能用它来做时间的减法。当你加上括号调用它时,就是在执行这个方法,得到一个返回值,然后你可以用这个返回值来进行减法运算。
5
在你的例子中,每次调用这个函数时,它都会被执行。这里需要注意的是,当在函数定义中把datetime.datetime.now()作为参数的默认值时,它只会在模块加载时执行一次。
举个例子:(这样做很危险,因为since只在模块加载时计算一次):
def hours_live(since=datetime.datetime.now()):
return since - self.created
你应该这样做:
def hours_live(since=None):
if not since:
since = datetime.datetime.now()
return since - self.created