2013-03-11 3 views
8

Я пытаюсь использовать метод свойства для установки состояния экземпляра класса, со следующим определением класса:сеттер метода собственности декоратора не называют

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 

Из результатов, хотя, кажется, что метод настройки не выполняется, хотя внутренняя переменная изменяется:

>>> 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!'