2017-06-13 51 views
1

代碼:差異__,__ get__

class Pizza: 
    def __init__(self, toppings): 
    self.toppings = toppings 
    self._pineapple_allowed = False 

    @property 
    def pineapple_allowed(self): 
    return self._pineapple_allowed 

    @pineapple_allowed.setter 
    def pineapple_allowed(self, value): 
    if value: 
     password = input("Enter the password: ") 
     if password == "Sw0rdf1sh!": 
     self._pineapple_allowed = value 
     else: 
     raise ValueError("Alert! Intruder!") 

我很困惑的@<func>.setter裝飾從僅僅覆蓋在物體的__set__功能有何不同。同樣的,@<func>.getter__get__

對於這個問題,我想不出用例的用於@property經過短短的類中設置變量。

我在想這一切錯了嗎?

回答

1

'@property'描述符可以控制一個類的屬性,在你的情況下是cls.pineapple_allowed,而__get__, __set__ and __delete__是描述符協議本身的神奇方法。如果您覆蓋任何上述方法的任何類,接入/轉讓/刪除任何類別的屬性會相應直通魔術方法。

1

我很困惑@<func>.setter修飾器與剛剛覆蓋對象中的__set__函數不同。同樣的,@<func>.getter__get__

不能直接覆蓋屬性對象的__set__方法,即使你能,它不會做任何事情,因爲Python將直接進入屬性對象的類屬性執行時,發現__set__分配。當Python正在將它們視爲語言功能的實現時,這適用於大多數雙雙下劃線方法。

使用.setter將函數記錄在屬性對象的實例屬性中,該屬性將由__set__委託給其執行設置。