2013-03-21 99 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