将参数传递给要装饰的类方法的装饰器

Posted

技术标签:

【中文标题】将参数传递给要装饰的类方法的装饰器【英文标题】:Pass parameters to a decorator for a class method is to be decorated 【发布时间】:2013-03-10 17:22:56 【问题描述】:

我正在尝试在烧瓶中定义一个装饰器,它最终将装饰传递该类实例参数的类方法。这是我真正想做的一个例子。

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)”实际上是我正在尝试的,因为我的问题还没有解决。

我无法从 HERE 找到解决方案。 请问有人知道这些东西吗?

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

正如你所说,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

【讨论】:

哦,是的!谢谢。我真的忘记了那件事。

以上是关于将参数传递给要装饰的类方法的装饰器的主要内容,如果未能解决你的问题,请参考以下文章

将附加参数传递给角度组件内的方法装饰器

将命令行参数传递给调用带有装饰器参数的装饰函数的函数

将默认参数传递给python中的装饰器

带有自参数的类方法装饰器?

在 Python 中,如何获取带参数传递给装饰器的函数名称?

将参数传递给 decontext 装饰器