От погружения в 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
>>>
Так что я делаю неправильно? Почему переменная класса не поддерживает ее значение как через прямую ссылку на класс, так и через любой экземпляр класса.
Поскольку ints неизменяемы в python
v.counter += 1
переупорядочивает v.counter
к новому объекту int. Переупорядочение создает атрибут экземпляра, который маскирует атрибут класса
Это можно увидеть, если вы посмотрите на id()
of 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]
>>>
v.counter
: новый объект int ... v.counter
До:
c.counter = 0
v.counter -> c.counter
Во:
c.counter = 0
v.counter = c.counter + 1
После:
c.counter = 0
v.counter = 1
Обратите внимание, что вы все равно можете получить значение класса:
v.__class__.__dict__['counter']
позволит вам читать или устанавливать в свой класс, даже если вы затеняли символ, добавив символ в свой экземпляр __dict __.
Вы путаетесь между объявлением и .
C - это имя объявленного вами класса.
v - объект, созданный из c.