0

次のようなクラスがあります。

class MBObject(ndb.Model):
    id = ndb.StringProperty()
    dictionary = ndb.JsonProperty(indexed=False, default = {})

私が欲しいのは、誰かが次のように MBObject を持っているかどうかです:

obj = MBObject()

次のように、任意のプロパティにアクセスします。

x = obj.author_id

舞台裏でこれを行うこと:

x = obj.dictionary["author_id"]

したがって、基本的にアクセスするプロパティが何であれ、クラスのプロパティにアクセスするのではなく、そのプロパティの辞書を調べます。

そして、これはセッターにも当てはまります:

x.author_id = 5

に変換する必要があります

x.dictionary["author_id"] = 5

これは Python で可能ですか。

(理由は聞かないでください。説明すると長くなってしまいます)

編集: わかりました。理由は次のとおりです。

サブクラスは Google App Engine では困難です。2 つの異なるクラス オブジェクトを作成し、1 つのクエリを実行して異なるクラス タイプのオブジェクトを取得することはできません。たとえそれらが同じ基本クラスから継承されていたとしてもです。for ループを使用してクエリを実行するか、PolyModel と呼ばれるものを使用する必要がありますが、これにより書き込みコストが増加します。

だから私が欲しいのは、事前定義された構造のない動的クラスです。GAE Expando クラスは使用したくありません。すべてのプロパティがデフォルトでインデックス化されているため、書き込みが非常に高価になるからです。(デフォルトをインデックスなしに設定できますが、インデックス付きとインデックスなしが必要ですが、それは提供されません)

したがって、私の唯一の選択肢は、すべてのプロパティを辞書に入れることです。便宜上、オブジェクト指向のように見せて、プロパティが実際に辞書に隠されているという事実を隠す必要があると考えました。

4

1 に答える 1

1

確かに、Python の魔法のメソッドの 1 つを使用して、これを簡単に行うことができます。

__getattr__()

http://www.rafekettler.com/magicmethods.html#access

オブジェクトで定義して、必要な機能を与えるだけです。

class MBObject(ndb.Model):

  def __getattr__(self, name):
     if name in self.dictionary:
       return self.dictionary.get(name)
     else:
       raise AttributeError
于 2012-11-30T00:41:41.883 に答える