Я создал class String()
с __get__()
, __set__()
и методом to_db()
; однако, когда я делаю name = String()
, я не могу выполнить self.name.to_db()
, потому что он вызывает to_db()
для значения, возвращаемого __get__()
, а не для объекта "name
".
class String(object):
def __init__(self, value=None):
if value:
self.value = str(value)
def __get__(self, instance, owner):
return self.value
def __set__(self, instance, value):
self.value = str(value)
def to_db(self):
return {'type':'string', 'value': self.value}
class Example(object):
name = String()
age = Integer()
def __init__(self,name,age):
self.name = name
self.age = age
def save():
data = dict(name=self.name.to_db(), age=self.age.to_db())
db.save(data)
Один из способов справиться с этим — не вызывать self.name.to_db()
напрямую, а вместо этого установить флаг в instance
и создать условное выражение в __get__()
, чтобы проверить его и вызвать to_db()
, если оно True
, но это кажется неуклюжим. Есть ли способ лучше?
Кроме того, я новичок в дескрипторах — каковы плюсы и минусы использования instance
и/или instance.__dict__
для хранения состояния по сравнению с сохранением его в self
?
String
объект дескриптора будет общим для всехExample
объектов. Итак, если вы создадитеexp1 = Example("Example1")
иexp2 = Example("Example2")
, тоexp1.name
иexp2.name
дадут тот же результат'Example2'
. Вместо этого используйтеproperty
согласно @JochenRitzel - person Jaynti Kanani   schedule 02.01.2014