2012-07-05 19 views
4

我想要一個Class屬性,它在類的新實例被實例化時設置datetime.now()。使用此代碼,MyThing.created似乎始終是在導入MyThing時,而不是在mt被實例化時。在實例化時帶有datetime.now()的Python類

from datetime import datetime 

class MyThing: 
    __init__(self, created=datetime.now()): 
     self.created = created 

MyThing.created 
datetime.datetime(2012, 7, 5, 10, 54, 24, 865791) 

mt = MyThing() 
mt.created 
datetime.datetime(2012, 7, 5, 10, 54, 24, 865791) 

我怎麼能做到這一點,這樣createdmt被實例化,而不是MyThing

回答

6

定義函數時,函數參數的默認值計算一次。在調用函數時不會重新評估它們。通常情況下,你會使用None作爲默認值,並測試其在體內:

def __init__(self, created=None): 
    self.created = created or datetime.now() 

更妙的是,它看起來像也許你不希望永遠傳遞一個創建日期爲構造,在這種情況下:

def __init__(self): 
    self.created = datetime.now() 
+0

很高興知道這兩種情況下的替代方案。謝謝 – MFB

4

不要在參數中設置它,因爲它們是函數本身的成員,因爲所有東西都是第一類對象。

class MyThing: 
    __init__(self, created=None): 
     self.created = created 
     if created is None: 
      self.created = datetime.now() 
+0

或者,''self.created = datetime.now(如果創建的話),但我認爲這是更清楚的是無其他created'' – syrion

+0

@syrion正確的。 – jamylak

+0

我只是討厭雙重任務。 :) – syrion