2016-05-13 26 views
-1

我想了解使用python的getters和setter。我理解的基本思路,但我不能得到它使用屬性裝飾工作,如何在python中使用@property更改屬性?

class f(object): 
    def __init__(self): 
     self.de = ['d', 'd'] 
    @property 
    def d(self): 
     return self.de 
    @d.setter 
    def d(self, value): 
     self.d = value 

f = f() 
f.d(1) 

當我運行這個我得到一個類型錯誤; 'list object is callable'

+1

'D'在'@ setter'和'de'在構造函數?還要注意,你的'de'是一個列表,所以你想把'value'加到列表中,而不是覆蓋整個列表,或者重命名參數來清楚它是一個新的列表,替換現有的列表。 – Jens

+0

'f.d [1]'會工作 – robyschek

回答

0

使用property的關鍵在於它在語法上與常規屬性訪問完全相同。所以:

f = f() 
f.d = 1 

(不過,我想你想在你的setter被設置self.de = value。)

+0

是的,這是我第一次這樣做,但我從ipython得到錯誤。 –

+0

如果在setter中沒有'self.de = value',您將獲得超過最大遞歸深度。內部'self.d = value'將擴展爲對setter的調用,該setter將擴展爲對setter的調用,等等。你之前得到的錯誤在別的地方,例如你的例子中的'f.d(1)'錯誤,'f.d'返回一個列表? – Neapolitan

0

下面是如何使用的屬性具有setter方法的例子。一些人認爲要注意:

  • 屬性就像屬性,通過使用object.property得到它們。他們不是方法,所以你不叫他們。
  • 您可以像屬性一樣設置屬性。當一個屬性被設置時,setter函數被調用。在這種情況下,someLength.inFeet = 2.5
  • 你不應該試圖設置屬性使用self.inFeet = ...inFeet二傳手裏面的setter函數,即。這將創建setter調用的無限循環(遞歸)。

的〔實施例:

class Length(object): 
    def __init__(self, inInches): 
     self.inInches = inInches 

    @property 
    def inFeet(self): 
     return self.inInches/12. 

    @inFeet.setter 
    def inFeet(self, valueInFeet): 
     self.inInches = valueInFeet * 12. 

someLength = Length(12.) 
print someLength.inInches 
# 12.0 
print someLength.inFeet 
# 1.0 
someLength.inFeet = 2.5 
print someLength.inInches 
# 30.0