我用__get__()
,__set__()
和方法to_db()
創建了一個class String()
;然而,當我做name = String()
,我不能做self.name.to_db()
,因爲它調用to_db()
__get__()
返回的值,而不是對象「name
」。如何調用Python類描述符對象的方法?
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__
來存儲狀態vs存儲在self
中的優點/缺點是什麼?
對於任何需要顯式方法調用的東西,不要使用描述符? – delnan 2011-05-16 21:38:38
對我來說,你試圖以錯誤的方式使用描述符。這裏有一個很好的描述:http://docs.python.org/howto/descriptor.html,特別注意property()的實現。 – 2011-05-16 22:30:43
你爲什麼不使用屬性? – 2011-05-16 23:21:25