From Dive into Python:
Class attributes are available both through direct reference to the class and through any instance of the class.
Clas
Because ints are immutable in python
v.counter += 1
rebinds v.counter
to a new int object. The rebinding creates an instance attribute that masks the class attribute
You can see this happening if you look at the id()
of v.counter
>>> id(v.counter)
149265780
>>> v.counter+=1
>>> id(v.counter)
149265768
Here you can see that v
now has a new attribute in its __dict__
>>> v=c()
>>> v.__dict__
{}
>>> v.counter+=1
>>> v.__dict__
{'counter': 1}
Contrast the case where counter
is mutable, eg a list
>>> class c:
... counter=[]
...
>>> v=c()
>>> v.counter+=[1]
>>> c.counter
[1]
>>>