Есть атрибуты класса и атрибуты экземпляра.
Когда вы говорите
class base :
derived_val = 1
Вы определяете атрибут класса. derived_val
становится ключом в
base.__dict__
.
t2=base()
print(base.__dict__)
# {'derived_val': 1, '__module__': '__main__', '__doc__': None}
print(t2.__dict__)
# {}
Когда вы говорите t2.derived_val
, Python пытается найти 'output_val' в t2.__dict__
. Поскольку его там нет, он ищет, есть ли ключ 'derived_val'
в любом из базовых классов t2
.
print(t2.derived_val)
print(t2.__dict__)
# 1
# {}
Но когда вы присваиваете значение t2.derived_val
, вы теперь добавляете атрибут экземпляра к t2
. Клавиша derived_val
добавлена к t2.__dict__
.
t2.derived_val = t2.derived_val+1
print(t2.derived_val)
print(t2.__dict__)
# 2
# {'derived_val': 2}
Обратите внимание, что на данный момент есть два derived_val
атрибута, но только
атрибут экземпляра легко доступен. Атрибут класса становится доступным только через ссылку base.derived_val
или прямой доступ к классу dict base.__dict__
.