Python--timedelta对象何时被处理?

3 投票
3 回答
995 浏览
提问于 2025-04-16 19:32

我有一个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

撰写回答