Экземпляр класса Python __dict__ не содержит всех переменных экземпляра. Зачем?

Вот немного нового вопроса Python о переменных экземпляра.

Рассмотрим следующее определение класса Python 2.7:

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

    def __init__(self):
            self.b = 2

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

Теперь, когда я создаю экземплярFoo, Foo.__dict__ содержитb, но нетa.

<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>

И тут я подумал, что довольно хорошо разбираюсь в Путь Питона.

В чем разница междуx.a а такжеx.b? Насколько я могу сказать, они обе переменные экземпляра.

EditОк, перечитываюPython документы я вижу этоFoo.a этоclass attribute а не переменная экземпляра. Хм ... Полагаю, путаница связана с тем, что я могу присвоить новое значениеx.a и новое значение влияет только наx экземпляр - я полагаю, что теперь я псевдоним переменной-члена поверх верхней частиFoo.a атрибут:

<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>

Итак, теперь я перезаписываю предыдущее значениеFoo.aи это влияет на все случаиFoo которые не имеют псевдонимовFoo.a:

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

Ответы на вопрос(3)

Ваш ответ на вопрос