Переменные класса Python или переменные класса в целом - PullRequest
1 голос
/ 02 августа 2010

Из погружения в Python:

Атрибуты класса доступны как через прямую ссылку на класс и через любой экземпляр класса.

Атрибуты класса могут использоваться как константы уровня класса, но они не совсем постоянные. Вы также можете изменить их.

Так что я набираю это в IDLE:

IDLE 2.6.5      
>>> class c:
        counter=0


>>> c
<class __main__.c at 0xb64cb1dc>
>>> v=c()
>>> v.__class__
<class __main__.c at 0xb64cb1dc>
>>> v.counter += 1
>>> v.counter
1
>>> c.counter
0
>>> 

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

Ответы [ 4 ]

8 голосов
/ 02 августа 2010

Потому что целые числа неизменны в питоне

v.counter += 1

связывает v.counter с новым объектом int. При повторной привязке создается атрибут экземпляра, который маскирует атрибут класса

Вы можете увидеть это, если вы посмотрите на id() из v.counter

>>> id(v.counter)
149265780
>>> v.counter+=1
>>> id(v.counter)
149265768

Здесь вы можете видеть, что v теперь имеет новый атрибут в __dict__

>>> v=c()
>>> v.__dict__
{}
>>> v.counter+=1
>>> v.__dict__
{'counter': 1}

Сравните случай, когда counter является изменяемым, например, list

>>> class c:
...  counter=[]
... 
>>> v=c()
>>> v.counter+=[1]
>>> c.counter
[1]
>>> 
0 голосов
/ 02 августа 2010

Обратите внимание, что вы все равно можете получить значение класса:

v.__class__.__dict__['counter'] 

позволит вам читать или устанавливать ваш класс, даже если вы затемнили символ, добавив символ в __dict__ вашего экземпляра.

0 голосов
/ 02 августа 2010

До:

c.counter = 0
v.counter -> c.counter

Во время:

c.counter = 0
v.counter = c.counter + 1

После:

c.counter = 0
v.counter = 1
0 голосов
/ 02 августа 2010

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

C - это имя объявленного вами класса.

v - это объект,создан из c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...