1

クラスを定義するときに関数をラップしようとしています。このクラスのインスタンスでメソッドを使用します

以下は動作するコードです

class A(object):   
    def __init__(self):    
        pass       

    @self_decorator 
    def to_be_decorated(self):
        pass       

def self_decorator(fn):    
    from functools import wraps
    @wraps(fn)     
    def wrapper(*args, **kwargs):
        self = args[0]     
        return self.app.route('/twip')(fn(*args, **kwargs))

    return wrapper

私が実際に取得しようとしているもの:

class A(object):   
    def __init__(self):    
        self.app = APP()    

    @self.app.wrapper_function # which apparently doesn't work
    def to_be_decorated(self):
        pass

それで、私の飾り方はうまくいくのでしょうか?

4

2 に答える 2

2

クラスはまだ存在せず、インスタンス化できないため、クラス定義には自己はありません。

使用できます

class A(object):
    app = APP()

    @app.wrapper_function
    def to_be_decorated(self):
        pass

しかし、それはクラス変数になります。

于 2012-11-14T01:01:18.350 に答える
0

デコレータは、定義時に呼び出される単なる関数です。

これを書くとき:

@self.app.wrapper_function # which apparently doesn't work
def to_be_decorated(self):
    pass

これは、これを書くこととほぼ同じです:

def to_be_decorated(self):
    pass
to_be_decorated = self.app.wrapper_function(to_be_decorated)

そのように見れば、なぜこれが機能しないのか、そしておそらく機能しないのかは明らかです。

まず、Aのクラス定義には自己変数がなく、たとえあったとしてもアクセスできるAメンバーがありません。app代わりに、 の各インスタンスにAは独自の一意の がありself.appます。

そして、通訳者に「私の言いたいことをしてほしい」と思っても、考えてみれば、それは何の意味もありません。「the」メソッドを呼び出したいのですself.app.wrapper_functionが、そんなことはありません。メソッドを定義または再定義できるすべての関連コードを読み通さない限り、self.app.wrapper_functionfrom の異なるインスタンスがA同じ基になる を持つという保証はまったくありませんfunc_code。しかし、それらがあったとしてもself.app.wrapper_function、バインドされたメソッド (メソッドが呼び出されたオブジェクトと一緒にバインドされたメソッド) であるため、それらはすべて互いに異なっています。

これを回避する方法はたくさんありますが、それらはすべて同じトリックになります。何らかの間接化を使用して、self.apporのメンバーではない関数を取得し、呼び出し時selfに参照します。self.appこれは基本的にあなたがするself_decoratorことであり、避けられません。

于 2012-11-14T01:54:58.863 に答える