Вы должны знать, как переменные класса обрабатываются в Python. Рассмотрим следующую иерархию классов:
class AAA(object):
x = 1
class BBB(AAA):
pass
class CCC(AAA):
pass
Теперь проверьте вывод следующего кода:
>>> print AAA.x, BBB.x, CCC.x
1 1 1
>>> BBB.x = 2
>>> print AAA.x, BBB.x, CCC.x
1 2 1
>>> AAA.x = 3
>>> print AAA.x, BBB.x, CCC.x
3 2 3
Удивлены? Вы не будете, если будете помнить, что переменные класса внутренне обрабатываются как словари объекта класса. Для операций чтения , если имя переменной не найдено в словаре текущего класса, его ищут в родительских классах. Итак, следующий код снова, но с пояснениями:
# AAA: {'x': 1}, BBB: {}, CCC: {}
>>> print AAA.x, BBB.x, CCC.x
1 1 1
>>> BBB.x = 2
# AAA: {'x': 1}, BBB: {'x': 2}, CCC: {}
>>> print AAA.x, BBB.x, CCC.x
1 2 1
>>> AAA.x = 3
# AAA: {'x': 3}, BBB: {'x': 2}, CCC: {}
>>> print AAA.x, BBB.x, CCC.x
3 2 3
То же самое касается обработки переменных класса в экземплярах классов (этот пример рассматривается как продолжение предыдущего):
>>> a = AAA()
# a: {}, AAA: {'x': 3}
>>> print a.x, AAA.x
3 3
>>> a.x = 4
# a: {'x': 4}, AAA: {'x': 3}
>>> print a.x, AAA.x
4 3