2013-03-11 70 views
8

我試圖用一個屬性的方法來設置一個類實例的狀態,下面的類定義:財產裝飾不是setter方法被調用

class Result: 
    def __init__(self,x=None,y=None): 
     self.x = float(x) 
     self.y = float(y) 
     self._visible = False 
     self._status = "You can't see me" 

    @property 
    def visible(self): 
     return self._visible 

    @visible.setter 
    def visible(self,value): 
     if value == True: 
      if self.x is not None and self.y is not None: 
       self._visible = True 
       self._status = "You can see me!" 
      else: 
       self._visible = False 
       raise ValueError("Can't show marker without x and y coordinates.") 
     else: 
      self._visible = False 
      self._status = "You can't see me" 

    def currentStatus(self): 
     return self._status 

從結果來看,雖然,它似乎setter方法沒有被執行,儘管內部變量正在被改變:

>>> res = Result(5,6) 
>>> res.visible 
False 
>>> res.currentStatus() 
"You can't see me" 
>>> res.visible = True 
>>> res.visible 
True 
>>> res.currentStatus() 
"You can't see me" 

我在做什麼錯?

回答

19

在Python 2裏,你必須繼承object的性質的工作:

class Result(object): 

,使之成爲新式類。隨着那個改變你的代碼工作:

>>> res = Result(5,6) 
>>> res.visible 
False 
>>> res.visible = True 
>>> res.currentStatus() 
'You can see me!'