Die Python-Klasseninstanz __dict__ enthält nicht alle Instanzvariablen. Warum?

Hier ist ein wenig eine neue Python-Frage zu Instanzvariablen.

Betrachten Sie die folgende Python 2.7-Klassendefinition:

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

    def __init__(self):
            self.b = 2

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

Nun, wenn ich eine Instanz vonFoo, Foo.__dict__ enthältb, aber nichta.

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

Und hier dachte ich, ich hätte ein ziemlich gutes Gespür für den Weg der Python.

Was ist der Unterschied zwischenx.a undx.b? Soweit ich das beurteilen kann, handelt es sich um beide Instanzvariablen.

Bearbeiten: OK, das nochmal durchlesenPython-Dokumente Ich sehe dasFoo.a ist einKlassenattribut anstatt eine Instanzvariable. Hm ... Ich denke, die Verwirrung rührt von der Tatsache her, dass ich einen neuen Wert zuweisen kannx.a und der neue Wert wirkt sich nur auf diex Beispiel - Ich nehme an, dass ich jetzt eine Mitgliedsvariable über dieFoo.a Attribut:

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

Also, jetzt überschreibe ich den vorherigen Wert vonFoo.aund betrifft alle Instanzen vonFoo das hat nicht geglättetFoo.a:

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

Antworten auf die Frage(3)

Ihre Antwort auf die Frage