Como passo um campo de classe para um decorador em um método de classe como argumento? O que eu quero fazer é algo como:
class Client(object):
def __init__(self, url):
self.url = url
@check_authorization("some_attr", self.url)
def get(self):
do_work()
Ele reclama que o eu não existe para passar self.url
para o decorador. Existe uma maneira de contornar isso?
python
python-decorators
Marca
fonte
fonte
Respostas:
Sim. Em vez de transmitir o atributo de instância no momento da definição da classe, verifique-o em tempo de execução:
O decorador intercepta os argumentos do método; o primeiro argumento é a instância, então ele lê o atributo disso. Você pode passar o nome do atributo como uma sequência para o decorador e usá-
getattr
lo se não desejar codificar o nome do atributo:fonte
fonte
Um exemplo mais conciso pode ser o seguinte:
Qual será impresso:
fonte
Outra opção seria abandonar o açúcar sintático e decorar na
__init__
sala de aula.o que imprimiria
fonte
Você não pode. Não há
self
no corpo da classe, porque não existe instância. Você precisaria passar, digamos, umstr
contendo o nome do atributo para pesquisar na instância, o que a função retornada pode executar ou usar um método completamente diferente.fonte