2012-03-08 11 views
2

私はクラス内の特定の関数を実行する前にユーザーがログインしているかどうかをテストするインターフェイスを設計しようとしています。むしろより:私が持っていることができればPython - クラス属性をテストするクラスメソッドをデコレートする

class UserDoesStuff(object): 
    def doIfLoggedIn(self): 
     if self.checkLogin(): 
      [...do the stuff...] 

私は思っていた。このような何か:

def protected(self): 
    if not self.checkLogin(): 
     raise UserLoginError() 

@protected 
def doIfLoggedIn(self): 
    [...do the stuff...] 

このコースのは動作しませんが、この使用してデコレータを行う方法はありますか? (余分な引数を持つ最も単純なもの、)

答えて

5

デコレータは、入力としての機能を期待する:

import functools 

def protected(fun): 
    @functools.wraps(fun) 
    def wrapper(self, *args, **kwargs): 
     if not self.checkLogin(): 
      raise UserLoginError() 
     return fun(self, *args, **kwargs) 

    return wrapper # this is what replaces the original method 

@protected 
def doIfLoggedIn(self): 
    ... 
+0

これはまさに私が探していたものです!本当にありがとう。それができるようになるとすぐに受け入れます。 –

関連する問題