我正在尝试围绕执行一些簿记的redis数据库实现一个包装器,我想到了使用描述符。我有一个包含大量字段的对象:框架,故障等,我需要能够获取,设置,并根据需要增加字段。我试图实现一个类似Int的描述符:
class IntType(object):
def __get__(self,instance,owner):
# issue a GET database command
return db.get(my_val)
def __set__(self,instance,val):
# issue a SET database command
db.set(instance.name,val)
def increment(self,instance,count):
# issue an INCRBY database command
db.hincrby(instance.name,count)
class Stream:
_prefix = 'stream'
frames = IntType()
failures = IntType()
uuid = StringType()
s = Stream()
s.frames.increment(1) # float' object has no attribute 'increment'
好像我无法访问描述符中的increment()方法。我不能在__get__返回的对象中定义增量。如果我想做的就是递增,这将需要额外的数据库查询!我也不想在Stream类上使用increment(),因为稍后当我想在Stream中有其他字段如字符串或集合时,我需要输入检查所有内容。
答案 0 :(得分:0)
这有用吗?
class Stream:
_prefix = 'stream'
def __init__(self):
self.frames = IntType()
self.failures = IntType()
self.uuid = StringType()
答案 1 :(得分:0)
试试这个:
class IntType(object):
def __get__(self,instance,owner):
class IntValue():
def increment(self,count):
# issue an INCRBY database command
db.hincrby(self.name,count)
def getValue(self):
# issue a GET database command
return db.get(my_val)
return IntValue()
def __set__(self,instance,val):
# issue a SET database command
db.set(instance.name,val)
答案 2 :(得分:0)
为什么不定义魔术方法 iadd 以及获取和设置。这将允许您在课堂上进行正常添加和作业。它还意味着您可以将增量与get函数分开处理,从而最大限度地减少数据库访问。
所以改变:
def increment(self,instance,count):
# issue an INCRBY database command
db.hincrby(instance.name,count)
为:
def __iadd__(self,other):
# your code goes here