2016-03-16 3 views
1

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

class Text(object): 

    @property 
    def color(self): 
     return 'blue' 

    @property 
    def length(self): 
     return 22 

t = Text() 
print t.color 

Когда я запускаю это, очевидно, возвращает blue. Но как я могу обновить значение цвета «на лету» позже в коде? То есть когда я пытаюсь сделать:

t = Text() 
print t.color 
t.color = 'red' 
print t.color 

Это терпит неудачу с ошибкой can't set attribute. Есть ли способ изменить значение свойства?

EDIT:

Если приведенный выше код переписан для использования сеттеров, как в ответ williamtroup, в чем преимущество того, чтобы просто сократить его:

class Text(object): 

    def __init__(self): 
     self.color = self.add_color() 
     self.length = self.add_length() 

    def add_color(self): 
     return 'blue' 

    def add_length(self): 
     return 22 
+0

Ответы правку; Не питоническая и нехорошая привычка. –

+0

@EddB Как это не Pythonic? – mart1n

+0

В любом случае, на вопрос был дан ответ. Это зависит от вас, чтобы решить, какой из них лучше всего реализовать. – williamtroup

ответ

3

Вам нужен сеттер для недвижимости и переменную класса для хранения данных.

С вашего примера:

class Text(object): 

    def __init__(self): 
     self._color = "blue" 
     self._length = 12 

    @property 
    def color(self): 
     return self._color 

    @color.setter 
    def color(self, value): 
     self._color = value 

    @property 
    def length(self): 
     return self._length 

    @length.setter 
    def length(self, value): 
     self._length = value 
+0

Если переписываться с помощью сеттеров, в чем преимущество перед просто использованием атрибутов? См. Мое редактирование на вопрос. – mart1n

+0

Обратитесь к этому вопросу: http://stackoverflow.com/questions/7374748/whats-the-difference-between-a-python-property-and-attribute. Это должно рассказать вам все, что вам нужно. – williamtroup

+0

Правильно, я понимаю разницу, но почему вы используете один над другим? Кроме того, если мне требуется значение по умолчанию, вычисленное на основе некоторой логики, мне понадобятся три функции: два свойства, getter и setter и еще одна функция для заполнения 'self._color' значением, основанным на этой логике. Это три функции только при использовании атрибутов. – mart1n

Смежные вопросы