Вызов декоратора с переменной класса в python
Возможно, я неправильно подхожу к проблеме, и есть более простое решение, но вот моя проблема.
У меня есть декоратор, определяемый следующим образом:
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 ответ:
У вас может быть доступ к декоратору
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
: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