在python中调用带有类变量的装饰器

时间:2014-06-24 19:10:34

标签: 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

然后我定义了一个类似这样的类:

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

    @my_decorator(self.argument)  # !this is an error! 
    def my_method(self):
       .... # does something

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

1 个答案:

答案 0 :(得分:3)

您可以让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

如果作为argument传递的变量根据正在修饰的函数而变化,您可以将其作为字符串传递给装饰器,并使用getattrself获取它:< / p>

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