2010-11-24 23 views
3

私がしたいのはこれです:引数を持つPythonクラスのデコレータを持つことは可能ですか?

@add_cache(cache_this, cache_that, cache_this_and_that) 
class MyDjangoModel(models.Model): 
    blah 

しかし、最初の引数が暗黙的に実際のクラスオブジェクトであると思われるので失敗します。これを回避することは可能ですか、この美しい構文とは対照的に、醜い構文を使用することを余儀なくされていますか?

答えて

5

あなたarg_cacheの定義は次のように何かをする必要があります。もちろん、3つのパラメータを使って別のことを行うこともできます。

+1

私の意見では、 'F(CLS)'のように、ネストされた関数により説明何かを引数を命名した方が良いされていると思います。説明のやり方ではもう少しいいですね。 – martineau

4

は、適切なデコレータを返す呼び出し可能を書きます。例では、あなただけの装飾が施され、クラスにいくつかのプロパティを設定したいと仮定し

def arg_cache(cthis, cthat, cthisandthat): 
    def f(obj): 
     obj.cache_this = cthis 
     obj.cache_that = cthat 
     obj.thisandthat = cthisandthat 
     return obj 
    return f 

@arg_cache(cache_this, cache_that, cache_this_and_that) 
... 

関連する問題