La instancia de la clase Python __dict__ no contiene todas las variables de instancia. ¿Por qué?

Aquí hay un poco de una pregunta de Python sobre las variables de instancia.

Considere la siguiente definición de clase de Python 2.7:

<code>class Foo(object):
    a = 1

    def __init__(self):
            self.b = 2

    def __repr__(self):
            return "%s" % self.__dict__
</code>

Ahora, cuando creo una instancia deFoo, Foo.__dict__ contieneb, pero noa.

<code>>>> x=Foo()
>>> x
{'b': 2}
>>> dir(x)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', 
 '__getattribute__', '__hash__', '__init__', '__module__', '__new__', 
 '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__',
 '__str__', '__subclasshook__', '__weakref__', 'a', 'b']
>>> x.__dict__
{'b': 2}
</code>

Y aquí pensé que tenía un buen conocimiento del Camino de Python.

Cuál es la diferencia entrex.a yx.b? Por lo que puedo decir, ambas son variables de instancia.

Editar: OK, releyendo elDocumentos de Python veo queFoo.a es unatributo de clase en lugar de una variable de instancia. Hm ... Creo que la confusión viene del hecho de que puedo asignar un nuevo valor ax.a y el nuevo valor solo afecta a lax instancia: supongo que ahora estoy asignando un alias a una variable miembro en la parte superior de laFoo.a atributo:

<code>>>> y=Foo()
>>> y.a = 2
>>> y
{'a': 2, 'b': 2}
>>> x
{'b': 2}
>>> x.a
1
>>> z=Foo()
>>> z
{'b': 2}
>>> z.a
1
>>> Foo.a
1
>>> x.a
1
>>> y.a
2
</code>

Entonces, ahora sobrescribo el valor anterior deFoo.a, y afecta a todas las instancias deFoo que no tienen aliasFoo.a:

<code>>>> Foo.a=999
>>> x.a
999
>>> y.a
2
</code>

Respuestas a la pregunta(3)

Su respuesta a la pregunta