2010-10-15 61 views
18

我有一個屬性類,我希望變成一個屬性,但該屬性設置在__init__。不知道這應該如何完成。如果沒有__init__設置PROPERT這很簡單和行之有效的如何在__init__中設置python屬性

import datetime 

class STransaction(object): 
    """A statement transaction""" 
    def __init__(self): 
     self._date = None 

    @property 
    def date(self): 
     return self._date 

    @date.setter 
    def date(self, value): 
     d = datetime.datetime.strptime(value, "%d-%b-%y") 
     self._date = d 

st = STransaction() 
st.date = "20-Jan-10" 

但是一旦初始化需要發生在__init__它變得更復雜,我不知道正確的行動當然。

class STransaction(object): 
    """A statement transaction""" 
    def __init__(self, date): 
     self._date = None 

奇怪的是,以下似乎工作,但聞起來非常糟糕。

class STransaction(object): 
    """A statement transaction""" 
    def __init__(self, date): 
     self._date = None 
     self.date = date 

    @property 
    def date(self): 
     return self._date 

    @date.setter 
    def date(self, value): 
     d = datetime.datetime.strptime(value, "%d-%b-%y") 
     self._date = d 

__init__中設置屬性的正確方法是什麼?

謝謝, 亞倫。

+1

一般來說,在更新屬性之前是否有任何理由設置'self._date = None',因爲它會立即被新值覆蓋? – 2010-10-15 13:39:26

+0

不是。只有第二行不存在纔有意義,因爲它沒有設置屬性「_date」來調用getter。 – nerdoc 2013-11-17 14:52:56

回答

17

我沒有看到任何真正的問題與您的代碼。在__init__中,該類完全創建,因此可以訪問屬性。

+0

好的,也許我正在看這個錯誤的方法。在__init__的位置是已經創建的屬性,所以我通過屬性訪問self.date的調用方式與我對st.date的調用方式相同? – 2010-10-15 12:01:12

+6

是的,(爲什麼Stackoverflow不喜歡簡短的點對點消息?它拒絕發佈「是,完全」)。 – 2010-10-15 12:03:43

+0

+1完全正確。我會補充說明__init__中的self._date = None在這段代碼中真的沒用(你可以在某些情況下使用RAII將屬性隱藏變量初始化到getter中('if not hasattr(self,_smth):do initialization。 ..') – ThR37 2010-10-15 12:05:47

4
class STransaction(object): 
    """A statement transaction""" 
    def __init__(self, date): 
     self._date = None #1 
     self.date = date #2 

如果要設置代理self._date對象而不執行setter,請使用#1行。如果您想在啓動時執行setter,請使用#2。兩種方式都是正確的,這只是你需要什麼的問題。

+1

爲什麼你要設置'_date'爲'None'當init清楚地被某個特定的'date'調用?你應該存儲正確的值,因此#1是不可行的。 – 2012-12-08 20:09:55