可能我会以错误的方式解决问题并且有一个更简单的解决方案,但这是我的问题。
我有一个像这样定义的装饰器:
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
,但是解决这个问题的正确方法是什么?
答案 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
传递的变量根据正在修饰的函数而变化,您可以将其作为字符串传递给装饰器,并使用getattr
从self
获取它:< / 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