Как передать поле класса декоратору метода класса в качестве аргумента? Что я хочу сделать, это что-то вроде:
class Client(object):
def __init__(self, url):
self.url = url
@check_authorization("some_attr", self.url)
def get(self):
do_work()
Он жалуется, что self не существует для передачи self.url
декоратору. Есть ли способ обойти это?
python
python-decorators
отметка
источник
источник
Ответы:
Да. Вместо передачи атрибута экземпляра во время определения класса, проверьте его во время выполнения:
Декоратор перехватывает аргументы метода; первый аргумент - это экземпляр, поэтому он считывает атрибут этого. Вы можете передать имя атрибута в виде строки декоратору и использовать его,
getattr
если не хотите жестко задавать имя атрибута:источник
источник
Более краткий пример может быть следующим:
Который напечатает:
источник
Еще один вариант - отказаться от синтаксического сахара и украсить его в
__init__
классе.который напечатал бы
источник
Ты не можешь Там нет
self
в теле класса, потому что нет экземпляра существует. Вам нужно было бы передать его, скажем,str
содержащее имя атрибута для поиска в экземпляре, который затем может сделать возвращаемая функция, или полностью использовать другой метод.источник