2013-03-21 102 views
3

我想在裝飾器中定義一個裝飾器,它最終將裝飾傳遞該類實例的參數的類方法。這是我真正想要做的一個例子。將參數傳遞給裝飾器的類方法將被裝飾

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" 

我所要做的是把類變量來裝飾。是的,「自我」沒有被定義,但「@ decorator.user_permission(self.my_name)」是我正在嘗試,因爲我還沒有解決我的問題。

我從HERE找不到解決方案。 請問有人知道這些東西嗎?

回答

5

正如你所說,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 
+0

哦,是啊! 謝謝。我真的忘了那件事。 – ln2khanal 2013-03-21 09:41:06

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