繁体   English   中英

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

[英]Pass parameters to a decorator for a class method is to be decorated

我试图在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"

我想要做的是将类变量传递给装饰器。 是的“自我”在那时没有定义,但“@ decorator.user_permission( self.my_name )”是我实际尝试的,因为我还没有解决我的问题。

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

正如你所说, self没有定义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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM