0

データベースから返された値のキャッシュを実装しようとしています:

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)

初めてタグプロパティを処理するときは、DB から値を取得し、次の使用のためにクラスフィールドタグインスタンスフィールドでオーバーライドする必要がありますが、エラーが発生します。

Traceback (most recent call last):
  File "/home/altera/www/autoblog/core/dbObject.py", line 99, in <module>
    print(x.tag)
  File "/home/altera/www/autoblog/core/dbObject.py", line 78, in getTag
    setattr(self, 'tag', value)
AttributeError: can't set attribute
4

2 に答える 2

2

残念ながら、a をオーバーライドすることはできません@property。これは、@propertyがインスタンスではなくクラスに関連付けられているためです。

@propertyゲッターをもう少し複雑にすることができます。

@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

または、キャッシュを行う記述子を作成します。

Undefined = object()

class DBValue(object):
    def __init__(self, column_name):
        self.column_name = column_name
        self.value = Undefined

    def __get__(self, instance, owner):
        if self.value is Undefined:
            self.value = instance._db.get(self.column_name)
        return self.value

class Foo(object):
    tag = DBValue("tag")
于 2012-09-19T21:34:08.617 に答える
0

あなたx.tagはプロパティであり、セッターを持っていないため、設定しようとすると、明らかな理由でエラーが発生します。したがって、実際の値を「プライベート」フィールドなどに保存し、そのx._tagためのゲッターとセッターを記述します。

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
于 2012-09-19T21:38:11.393 に答える