Python - timedelta对象何时处理?

时间:2011-06-14 15:04:07

标签: python django datetime

我有以下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 个答案:

答案 0 :(得分:6)

datetime.datetime.now是一种方法。当您在没有括号的情况下调用它时,您指的是方法本身,并且您无法从方法中减去时间。当您使用括号调用时,您正在调用方法,获取返回值,然后将其用于减法。

答案 1 :(得分:5)

在您的示例中,每次调用函数时都会执行它。问题是当datetime.datetime.now()用作函数定义中参数的默认值时。在这种情况下,它只在加载模块时执行一次。

例如:(这很危险,因为因为只在模块加载时计算一次):

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

答案 2 :(得分:3)

当然,每次调用hours_live时都会执行它,这是一个正常的函数调用。