2009-12-16 56 views
8

我玩弄Python中的屬性,我想知道這是如何@ propertyName.deleter裝飾工程。我可能錯過了一些東西,我找不到Google的明確答案。deleter裝飾使用Python中的屬性

我想實現的是當這個deleter行爲被調用時,我可以觸發其他動作(例如:使用我的3d應用程序SDK)。

現在只是一個簡單的打印()似乎並沒有被觸發。

deleter當我使用刪除屬性del(instance.property)

否則,我該如何做到這一點?

 

class M(): 

    def __init__(self): 
     self._m = None 

    @property 
    def mmm(self): 
     return self._m 

    @mmm.setter 
    def mmm(self, val): 
     self._m = val 

    @mmm.deleter 
    def mmm(self): 
     print('deleting') # Not printing 
     del(self._m) 




if __name__ == '__main__': 

    i = M() 
    i.mmm = 150 
    print(i.mmm) 
    del(i.mmm) 
    print(i.mmm) 

 

非常感謝你(:

回答

9

讓米新式類:

class M(object): 

http://www.python.org/download/releases/2.2.3/descrintro/#property

屬性不經典 類工作,但你沒有清楚地知道 錯誤,當你嘗試這個。的GET 方法將被調用,所以纔出現 工作,但在屬性 分配,一個典型的類實例 只會設置在其 字典值,而無需調用的屬性的設置方法,並在此之後, 的財產的get方法將不會被調用 。 (你可以重寫 SETATTR來解決這個問題,但它是非常昂貴的。)

+0

確實不是一個明確的錯誤,謝謝爲了快速回答。 – Xavier 2009-12-16 04:30:50

6

在Python 3,你會看到print的結果 - 然後最後打印一個AttributeError(因爲_m已經消失)。您可能會使用Python 2.6,在這種情況下,您需要將class子句更改爲class M(object):以使M爲新樣式,然後您將獲得與Python 3中相同的行爲。

+0

我的確在使用Python 2.6。謝謝亞歷克斯你的時間 – Xavier 2009-12-16 04:26:40

+1

@Xavier,你是特殊的SO行爲,感謝我,感謝並接受unutbu - 而不是upvote一個或兩個答案!當你喜歡答案(或者問題)時,你應該注意它 - 這就是保持系統正常工作的原因。 – 2009-12-16 05:25:31

+0

@亞歷克斯,謝謝你指出(: - 我的壞。 – Xavier 2009-12-16 14:06:22