【发布时间】:2011-05-16 21:20:46
【问题描述】:
我用__get__()、__set__()和一个方法to_db()创建了一个class String();但是,当我执行name = String() 时,我不能执行self.name.to_db(),因为它在__get__() 返回的值上调用to_db(),而不是对象“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 中的优缺点是什么?
【问题讨论】:
-
对于任何需要显式方法调用的东西不使用描述符怎么样?
-
在我看来,您试图以错误的方式使用描述符。这里有一个很好的描述:docs.python.org/howto/descriptor.html,特别注意property()的实现。
-
你为什么不使用属性?
-
String描述符对象将在所有Example对象之间共享。因此,如果您创建exp1 = Example("Example1")和exp2 = Example("Example2"),那么exp1.name和exp2.name将给出相同的输出'Example2'。使用property代替@JochenRitzel
标签: python descriptor