2013-03-11 9 views
8

Sto cercando di utilizzare un metodo di proprietà per impostare lo stato di un'istanza di classe, con la seguente definizione di classe:metodo setter di proprietà non decoratore essere chiamato

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 

Dai risultati, però, sembra che il metodo setter non è in esecuzione, anche se la variabile interna viene cambiata:

>>> 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" 

che cosa sto facendo di sbagliato?

risposta

19

su Python 2, è necessario ereditare da object oggetti da lavorare:

class Result(object): 

per renderlo un classe di nuovo stile. Con questo cambio funziona il tuo codice:

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