描述符的方法

时间:2013-12-13 16:39:53

标签: python redis

我正在尝试围绕执行一些簿记的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中有其他字段如字符串或集合时,我需要输入检查所有内容。

3 个答案:

答案 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