@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 its 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 its base classes - note that means it is possible to shadow a class variable in a subclass.