Let's say I define class A:
>>> class A:
... a = 1
... class SubA:
... sub_a = { 'a': 1, 'b': 1}
Then I define class B that inherits from A:
>>> class B(A):
... pass
Now, check __dict__ of A and __dict__ of B:
>>> A.__dict__
{'a': 1, '__module__': '__builtin__', '__doc__': None, 'SubA': }
>>> B.__dict__
{'__module__': '__builtin__', '__doc__': None}
Somehow, B.__dict__ contains neither 'a' nor 'SubA'.
Now if we do:
>>> A.a
1
>>> B.a
1
>>> A.SubA
>>> B.SubA
First question: why B.__dict__ does not contain 'a' and 'SubA'?
Second question: Why B.a and B.SubA give the expected results, although neither 'a' nor 'SubA' is in B's __dict__?
Thanks!
解决方案
@bgporter has given a good explanation of the behaviour, I'll just go into why a little:
If your class variable was in B.__dict__, how would it function? Each subclass would have it's own value for a, independent of the value for A.a - this is not what you would expect. A class variable should exist once - in that class.
Instead, Python does a lookup on the class and if it doesn't exist, then looks up to it's base classes - note that means it is possible to shadow a class variable in a subclass.