В объекте класса хранится только один объект дескриптора, поэтому self
всегда одинаков. Если вы хотите хранить данные для каждого объекта и получать к ним доступ через дескриптор, вы должны либо хранить данные по каждому объекту (возможно, лучшая идея), либо в какой-либо структуре данных, связанной с каждым объектом (идея, которая мне не нравится столько же).
Я бы сохранил данные об объекте экземпляра:
class Desc(object):
default_value = 10
def __init__(self, name):
self.name = name
def __get__(self,obj,objtype):
return obj.__dict__.get(self.name, self.default_value)
# alternatively the following; but won't work with shadowing:
#return getattr(obj, self.name, self.default_value)
def __set__(self,obj,val):
obj.__dict__[self.name] = val
# alternatively the following; but won't work with shadowing:
#setattr(obj, self.name, val)
def __delete__(self,obj):
pass
class MyClass(object):
desc = Desc('varx')
В этом случае данные будут сохранены в записи obj
'' varx 'в ее __dict__
. Из-за того, как работает поиск по дескриптору данных, вы можете «затенить» место хранения с помощью дескриптора:
class MyClass(object):
varx = Desc('varx')
В этом случае, когда вы выполняете поиск:
MyClass().varx
Объект дескриптора вызывается и может выполнять свой поиск, но когда поиск выглядит так:
MyClass().__dict__['varx']
Значение возвращается напрямую. Таким образом, дескриптор может хранить свои данные в «скрытом», так сказать, месте.