2016-06-01 2 views
2

Я пытаюсь узнать о статических переменных в python. По словам this ответа на этот кусок кода должен сделать i уникальным для всех объектов класса TestСтатические переменные экземпляра в python

Код:

>>> class Test(object): 
...  _i = 3 
...  @property 
...  def i(self): 
...    return self._i 
...  @i.setter 
...  def i(self,val): 
...    self._i = val 
... 
>>> 
>>> x1 = Test() 
>>> x1.i 
3 
>>> x2 = Test() 
>>> x2.i 
3 
>>> x1.i = 10 
>>> x1.i 
10 
>>> x2.i 
3 

Но как вы можете видеть объект x1.i не равен x2.i.
Я попытался сделать это как в python 2.7, так и в 3.4, но результат такой же. Я думаю, что мое понимание об этой концепции неверно.

Может кто-нибудь, пожалуйста, объясните это мне или направьте меня на ресурс.

+1

Они уникальны, как вы ожидали в вашем втором предложении. В чем ваш вопрос? – Selcuk

+3

Этот связанный ответ ошибочен. 'self._i = val' присваивает локальному атрибуту этого экземпляра * _i * (который затем меняет класс attr), а не атрибут класса. –

+0

Вы должны взглянуть на [это] (http://stackoverflow.com/a/69067/4642859) – 3kt

ответ

1

Как отмечено, linked answer ошибочно.

class Test(object): 
    i = 0 


t = Test() 
t.i = 4 
print t.i 
>>> 4 
print t.__class__.i 
>>> 0 

Поля, объявленные на class ищутся, когда не обнаружили на экземпляре, но вы не можете изменить класс непосредственно через self. self.i = 4 всегда изменяет экземпляр. Вы можете делать такие вещи, как

class Test(object): 
    _i = 0 

    @property 
    def i(self): 
     return self._i 

    @i.setter 
    def i(self, value): 
     Test._i = value 

Но дублируя имя класса повсюду не кажется хорошей идеей и self.__class__ не играет слишком хорошо с наследованием. Это также полностью скрывает тот факт, что i был изначально переменной класса, которая может и не быть хорошей идеей.

+0

Я не уверен, что вы подразумеваете под «Поля, объявленные в классе, копируются в словарь пользователя», но это звучит не так. 'i' не находится в экземпляре dict, пока вы не установите его явно на' t'; скорее, когда Python решает имя, он возвращается к атрибуту уровня класса, если он не найден на уровне экземпляра. –

+0

@ DanielRoseman Хмм. Кажется, я пал на магию 'dir()' здесь (он показывает 'i'). Исправленный. – dhke

0
class Test(object): 

    _i = 3 

    @property 
    def i(self): 
     return self._i 

    @i.setter 
    def i(self,val): 
     self._i = val 

if __name__ == '__main__': 

    x1 = Test() 
    x2 = Test() 

    x1.i = 10 
    print(x1.__dict__) 
    print(Test.__dict__) 

{'_i': 10} 
{'i': <property object at 0x02551180>, '__weakref__': <attribute '__weakref__' of 'Test' objects>, '_i': 3, '__module__': '__main__', '__doc__': None, '__dict__': <attribute '__dict__' of 'Test' objects>} 

x1.i = 10 создания значения объекта

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