🎯 Decoradores em Python
Em poucas palavras
Definição técnica ou simplificada do conceito.
📝 Notas e Desenvolvimento
Um decorador em Python é uma função de ordem superior que recebe outra função como argumento, adiciona alguma funcionalidade a ela e retorna a função modificada. Decoradores são uma forma elegante de estender ou modificar o comportamento de funções ou métodos sem alterar sua estrutura original. Eles são aplicados usando o símbolo @ antes da definição da função.
Exemplo:
Vamos criar um decorador que imprime uma mensagem antes e depois da execução de uma função:
def announce(f):
def wrapper():
print("About to run the function")
f()
print("Done with the function")
return wrapper
@announce
def hello():
print("Hello, World!")
hello()Saída:
About to run the function
Hello, World!
Done with the function
Explicação:
announce(f): Esta é a função decoradora. Ela recebe uma funçãofcomo argumento.wrapper(): Esta é uma função interna definida dentro deannounce. Ela envolve a função originalf.- Imprime “About to run the function”.
- Chama a função original
f(). - Imprime “Done with the function”.
- Retorna a função
wrapper.
@announce: Esta sintaxe aplica o decoradorannounceà funçãohello. É equivalente a:hello = announce(hello).hello(): Quando chamamoshello(), na verdade estamos chamando a funçãowrapperretornada porannounce.
Como funciona:
O decorador announce “embrulha” a função hello com a funcionalidade adicional de imprimir mensagens antes e depois da execução.
Outro exemplo com argumentos:
Se a função que você está decorando recebe argumentos, você precisa passar esses argumentos para a função wrapper:
def greet(name):
return f"Hello, {name}!"
def uppercase_decorator(func):
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
return result.upper()
return wrapper
@uppercase_decorator
def greet(name):
return f"Hello, {name}!"
print(greet("Alice")) # Output: HELLO, ALICE!Explicação:
*argse**kwargs: Permitem que a funçãowrapperreceba qualquer número de argumentos posicionais e nomeados, respectivamente.result = func(*args, **kwargs): Chama a função original com os argumentos recebidos.return result.upper(): Converte o resultado para maiúsculas.
Usos comuns de decoradores:
- Logging
- Controle de acesso (autenticação, autorização)
- Medição de tempo de execução
- Cache
- Validação de argumentos
Referência:
🔗 Conexões e Contexto
- Atlas: MdC - Programação
- Notas Relacionadas: