为一个要装饰的类方法传递参数给装饰器

3 投票
2 回答
1977 浏览
提问于 2025-04-17 19:51

我正在尝试在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”还没有定义,但我实际上是想用“@decorator.user_permission(self.my_name)”,因为我还没有解决我的问题。

我在这里找不到解决方案。有没有人知道这些东西吗?

2 个回答

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
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

撰写回答