Python - timedelta对象何时处理?

Ben*_*Ben 3 python django datetime

我有以下Django模型:

   created=models.DateTimeField(auto_now_add=True)
Run Code Online (Sandbox Code Playgroud)

我现在需要一个模型对象方法,它显示自创建以来的小时数.我尝试了以下方法:

  def hours_live(self):
    diff=((datetime.datetime.now - self.created).seconds)/3600
    return diff   
Run Code Online (Sandbox Code Playgroud)

但它抛出了一个TypeError

unsupported operand type(s) for -: 'builtin_function_or_method' and 'datetime.datetime'
Run Code Online (Sandbox Code Playgroud)

然后我去了

 def hours_live(self):
    diff=((datetime.datetime.now() - self.created).seconds)/3600
    return diff   
Run Code Online (Sandbox Code Playgroud)

我的问题是datetime.datetime.now()表达式是在这里只执行一次,还是每次调用hours_live时都执行.

这会有用吗?

mip*_*adi 6

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


mah*_*oud 5

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

例如:(这是因为是危险的,因为仅计算当所述模块被加载一次):

def hours_live(since=datetime.datetime.now()):
    return since - self.created
Run Code Online (Sandbox Code Playgroud)

你应该做的事情:

def hours_live(since=None):
    if not since:
        since = datetime.datetime.now()
    return since - self.created
Run Code Online (Sandbox Code Playgroud)