Разберите механизм доступа к атрибуту: какое значение напечатает код и почему запись в __dict__ не меняет результат?
class D:
def __get__(self, obj, owner):
return 'descriptor'
def __set__(self, obj, value):
raise AttributeError('read only')
class C:
x = D()
c = C()
c.__dict__['x'] = 'instance'
print(c.x)