0

ユーザーのモデルクラスを作成したいのですが。ユーザーのデータは、couchdbやmongodbなどのドキュメントベースのデータベースに保存されます。クラスUserにはデコレータが必要であり、db内のフィールドには、実際には存在しないクラス属性を介してアクセスできます。例えば

@DocumentDB()
class User(object):
    def doSomething(self):
        pass
    def doSomethingElse(self):
        pass

u = User('thisIsAUniqUserId')
print u.emailAddress
print u.lastName

私はPythonデコレータで遊んだことがあります。既存の関数を操作することは大きなことではありませんが、オブジェクトのインスタンスを介してdb値への透過的なアクセスを作成するために、存在しないゲッター/セッターの呼び出しをどのようにキャッチできますか?

4

4 に答える 4

2

__getattr__(self, name) メソッドを実装する必要があります。

于 2013-01-15T08:34:22.197 に答える
1

Djangoはメタクラスを使用してモデルを動的に作成します。要件は少し異なりますが、同じ手法で機能します(おそらくデコレータよりも優れています)。

StackoverflowでPythonメタクラスの詳細を読むことができます。

于 2013-01-15T09:00:03.180 に答える
1

オブジェクトの属性へのアクセスは、getattr / setattr / delattr/getattributeメカニズムによって制御されます。

于 2013-01-15T08:25:21.543 に答える
0

私はあなたの提案に基づいて解決策を見つけたと思います:

def DocumentDB(object):
    class TransparentAttribute:
        def __init__(self, *args, **kargs):                 
            self.wrapped = object(*args, **kargs)
        def __getattr__(self, attrname):
            return "Any Value"
    return TransparentAttribute

@DocumentDB
class User(object):
    def doSomething(self):
        pass
    def doSomethingElse(self):
        pass

u = User()
print u.emailAddress
print u.lastName

それは機能しますが、それは最もpythoniasticな方法ですか?

于 2013-01-15T09:16:49.793 に答える