2012-03-08 75 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

這正是我所期待的!非常感謝。只要它讓我接受,就會接受。 – 2012-03-08 15:45:33