Вызов декоратора с переменной класса в 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 2

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