2011-06-14 70 views
3

我有以下的Django模型:Python - timedelta對象何時被處理?

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時被調用。

這項工作?

回答

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 
+0

很好的例子馬哈茂德,爲感謝澄清它。 – Ben 2011-06-14 17:12:05

3

當然,它每次調用hours_live時都會執行,這是一個正常的函數調用。

6

datetime.datetime.now是一種方法。當你在沒有括號的情況下調用它時,你指的是方法本身,並且你不能從方法中減去一個時間。當你用括號將它稱爲時,你正在調用該方法,獲得返回值,然後將其用於減法。