vkopey
print B.__dict__ # почему здесь нет ‘a’ ?
Потому что
a - это атрибут класса
A и его нет в B.__dict__.
vkopey
print dir(B) # а здесь ‘a’ есть
print B.a # почему a=1 ?
Атрибуты базовых классов берутся в порядке
MRO.
Т.е. в классах старого стиля есть атрибут __bases__, в новых классах (унаследованных от object) есть __mro__. Если атрибут не нашелся в
B, они ищется выше по иерархии.
Еще:
B.a = 2 # теперь B.a - атрибут B
print A.a # 1
print B.__dict__ # {... 'a': 2}
# и присваивание атрибуту базового класса значения
A.a = 3
# не влияет на B
print B.a # 2
Вот еще для размышлений о затенении атрибутов класса атрибутами экземпляра:
http://stackoverflow.com/a/69067/1052325