3

最終的にそのクラスインスタンスのパラメータを渡すクラスメソッドをデコレートするデコレータをflaskで定義しようとしています。これが私が本当にやりたいことの例です。

from functools import wraps
def user_permission(myname):
    def decorator(f):
        @wraps(f)
        def decorated(*args,**argws):
            if myname == 'My Name':
                return f(*args,**argws)
            else:
                return "Not Permitted"
        return decorated
    return decorator

そして、私のマネージャークラスは次のように定義されています。

class Manager(flask.views.MethodView):

def __init__(self,name):
    self.name = name
@user_permission(self.my_name)
def post(self):
    return "Response"

def get(self):
    return "Response"

私がやろうとしているのは、クラス変数をデコレータに渡すことです。はい、その時点では「self」は定義されていませんが、「@ decode.user_permission(self.my_name)」は、まだ問題が解決されていないため、実際に試しているものです。

ここから解決策を見つけることができませんでした。誰かがこれらのものについて知っていますか?

4

2 に答える 2

6

あなたが言うように、selfその時点では定義されていません。クラスが定義されたときにデコレータが実行されるのに対し、インスタンスメソッドが呼び出されたときに何かを実行する必要があるため、これは機能しません。

しかし、あなたはこれを本当に複雑にしすぎていると思います。selfメソッド自体に渡されます。したがって、デコレータはメソッド引数にアクセスできるため、デコレータのパラメータにしようとする理由はありません。これははるかに簡単です:

from functools import wraps
def user_permission():
    @wraps(f)
    def decorated(self, *args, **kwargs):
        if self.myname == 'My Name':
            return f(self, *args, **kwargs)
        else:
            return "Not Permitted"
    return decorated
于 2013-03-21T09:25:37.033 に答える
2

self単なる議論です。デコレータファクトリは必要ありません。

def user_permission(f):
    @wraps(f)
    def decorated(self, *args, **kw):
        if self.myname == 'My Name':
            return f(self, *args, **kw)
        else:
            return "Not Permitted"

    return decorated
于 2013-03-21T09:25:04.907 に答える