2013-11-14 1 views
1

Возьмите этот простой пример класса:Почему список элементов, обернутый атрибутом, отображает неожиданные значения?

class vec: 
    def __init__(self,v=(0,0,0,0)): 
     self.v = list(v) 

    @property 
    def x(self): 
     return self.v[0] 

    @x.setter 
    def set_x(self, val): 
     self.v[0] = val 

... и это использование:

>> a = vec([1,2,3,4]) 
>> a.v 
[1,2,3,4] 
>> a.x 
1 
>> a.x = 55 
>> a.x 
55 
>> a.v 
[1,2,3,4] 

Почему массив членов (в частности, self.v[0]) и сообщенное значение свойства не согласны? Если это не в self.v, то откуда взялось значение измененного свойства?

ответ

1

Вы должны использовать класс нового стиля. И имя установщика должно быть x, а не set_x.

class vec(object): # <----- 
    def __init__(self,v=(0,0,0,0)): 
     self.v = list(v) 

    @property 
    def x(self): 
     return self.v[0] 

    @x.setter 
    def x(self, val): # <-------- 
     self.v[0] = val 

По property documentation:

Вернуться атрибут недвижимости для новых классов (классы, которые являются производными от объекта).

Если вы не используете класс нового стиля, a.x = ... создает новый атрибут x вместо вызова сеттера.

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