具有属性重写的实例

2024-09-29 23:28:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试实现从数据库返回的值的缓存:

class Foo

...

    def getTag(self):
        value = self._Db.get(self._f[F_TAG])

        setattr(self, 'tag', value)

        return value

    def _setTag(self, tag):
        self._Db.set(self._f[F_TAG], tag)


    tag = property(getTag)

...

x = Foo()        

x._setTag("20")
print(x.tag)
x._setTag("40")
print(x.tag)

当我第一次处理标记属性时,它必须从数据库中获取值,并用实例字段重写字段标记,以便以后使用,但出现错误:

^{pr2}$

Tags: 标记self数据库dbgetfoovaluedef
2条回答

不幸的是,不可能重写@property。这是因为@property附加到类,而不是实例。在

您可以使@propertygetter稍微复杂一点:

@property
def tag(self):
    try:
        return self._db_values["tag"]
    except KeyError:
        pass
   val = self._db.get("tag")
   self._db_values["tag"] = val
   return val

或者创建一个描述符来为您进行缓存:

^{pr2}$

您的x.tag是一个属性,没有setter,因此当您尝试设置它时,您会收到一个错误,原因很明显。因此,将实际值存储在一个“private”字段中,比如x._tag,并为其编写一个getter和setter。在

class Foo(object):

    _tag = None

    @property
    def tag(self):
        if self._tag is None:
            self._tag = self._Db.get(self._f[F_TAG])
        return self._tag

    @tag.setter
    def tag(self, tag):
        self._tag = tag
        self._Db.set(self._f[F_TAG], tag)

x = Foo()
print x.tag    # gets the value from the database (if necessary) or f._tag
x.tag = "bar"  # sets the value in the database and caches it in f._tag

相关问题 更多 >

    热门问题