我创建了一个class String()
with __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()
if it's True
,但这似乎很笨拙。有没有更好的办法?
另外,我是描述符的新手——使用instance
和/或instance.__dict__
存储状态与存储状态的优缺点是self
什么?