2012-04-30 24 views
2

我剛剛啓動Python,因此如果我缺少明顯的東西,請耐心等待。我已閱讀關於裝飾以及它們如何工作,我試圖瞭解這如何被翻譯:Python setter裝飾器是如何工作的

class SomeObject(object): 

    @property 
    def test(self): 
     return "some value" 

    @test.setter 
    def test(self, value): 
     print(value) 

從我已閱讀,這應該變成:

class SomeObject(object): 

    def test(self): 
     return "some value" 

    test = property(test) 

    def test(self, value): 
     print(value) 

    test = test.setter(test) 

然而,當我試試這個,我得到

AttributeError: 'function' object has no attribute 'setter' 

有人可以解釋這種情況下翻譯的工作原理嗎?

+1

我明白,但爲了正確地使用裝飾,你首先需要了解他們的工作。 (當我說「應該」時,我在談論運行時) – Flavien

+0

這很好,只是認爲我爲了教育原因確保你這麼做了,並不是因爲你認爲這是一個普通代碼的好主意。 –

回答

6

你得到那個AttributeError的原因是def test在類的範圍內重新定義test。類中的函數定義並不特別。

你的例子就是這樣的工作

class SomeObject(object): 

    def get_test(self): 
     return "some value" 

    def set_test(self, value): 
     print(value) 

    test = property(get_test) 
    test = test.setter(set_test) 
    # OR 
    test = property(get_test, set_test) 
+0

謝謝,這是有道理的。獎金問題,爲什麼當我在一個對象上調用它時,這不起作用? obj.test = obj.test.setter(obj.set_test) – Flavien

+3

因爲描述符僅在類上設置時才起作用。在屬性檢索期間,Python將檢查類中的描述符,並在它們存在時調用它們。另一個例子是綁定方法.'SomeObject.get_test'是你的原始函數,它接受一個參數,但'someinstance.get_test is'是一個不帶參數的綁定方法。它將curinst(「凍結」)作爲第一個參數。 – Lucian