在python中使用类变量调用装饰器

Gio*_*lia 4 python decorator python-decorators

可能我以错误的方式解决问题并且有一个更简单的解决方案,但这是我的问题。

我有一个这样定义的装饰器:

def my_decorator(argument):
    def wrap(f):
       def wrapped_f(*args, **kwargs):
           .... # does something with argument
       return wrapped_f
    return wrap
Run Code Online (Sandbox Code Playgroud)

然后我定义了一个看起来像这样的类:

class MyClass(object):
    def __init__(argument):
        self.argument = argument

    @my_decorator(self.argument)  # !this is an error! 
    def my_method(self):
       .... # does something
Run Code Online (Sandbox Code Playgroud)

显然我写的是错误的,因为在装饰器级别我无法访问self,但是解决这个问题的正确方法是什么?

dan*_*ano 6

您可以在self.argument内部拥有装饰器访问权限wrapped_f

def mydecorator(f):
   def wrapped_f(self, *args, **kwargs):
       argument = self.argument
       .... # does something with argument
       return f(self, *args, **kwargs)
   return wrapped_f
return wrap
Run Code Online (Sandbox Code Playgroud)

如果传递的变量argument根据被装饰的函数发生变化,您可以将其作为字符串传递给装饰器并用于getattrself以下位置获取它:

def my_decorator(arg_name):
    def wrap(f):
       def wrapped_f(self, *args, **kwargs):
           argument = getattr(self, arg_name)
           .... # does something with argument
       return wrapped_f
    return wrap

class MyClass(object):
    def __init__(self, argument):
        self.argument = argument

    @my_decorator("argument")
    def my_method(self):
       .... does something
Run Code Online (Sandbox Code Playgroud)