Decoradores Python: funções de encapsulamento e modificação
Aprenda decoradores Python para modificar o comportamento da função dinamicamente. Entenda as funções do wrapper, a sintaxe @ e o tratamento de argumentos em decoradores.
Visão geral
Decoradores são um dos padrões de design mais elegantes e poderosos do Python. Eles permitem que os desenvolvedores modifiquem ou estendam o comportamento de uma função, método ou classe sem alterar permanentemente seu código-fonte. Pense em um decorador envolvendo uma função dentro de outra função para executar etapas de pré e pós-processamento. Isso torna os decoradores perfeitos para implementar preocupações transversais como registro, tempo, validação ou controle de acesso.
Basicamente, os decoradores funcionam porque as funções do Python são cidadãs de primeira classe. Isso significa que funções podem ser passadas como argumentos para outras funções, retornadas de funções e atribuídas a variáveis. Um decorador é simplesmente uma função que recebe outra função como argumento, define uma função wrapper aninhada que executa a função original junto com alguma lógica extra e retorna essa função wrapper para substituir a original.
Para tornar a aplicação de decoradores simples e limpa, Python fornece o açúcar sintático `@decorator_name`, colocado imediatamente acima da definição da função alvo. Ao chamar a função decorada, o Python invoca o wrapper. Se a função aceita parâmetros, o wrapper deve aceitar argumentos arbitrários (`*args` e `**kwargs`) e encaminhá-los corretamente. Compreender os decoradores permite que você escreva código altamente modular, limpo e DRY (Don't Repeat Yourself).
Saída de código e execução
Um decorador personalizado que rastreia e registra detalhes de execução de funções.
def call_tracker(func):
"""Decorator that tracks and logs function execution details."""
def wrapper(*args, **kwargs):
print(f"Calling {func.__name__} with args: {args}")
result = func(*args, **kwargs)
print(f"{func.__name__} returned: {result}")
return result
return wrapper
@call_tracker
def multiply(a, b):
return a * b
# Calling the decorated function
result = multiply(5, 4)Calling multiply with args: (5, 4)
multiply returned: 20Implementação passo a passo
- Registrando métricas de tempo de execução em monitores de desempenho
- Aplicando verificações de autenticação e autorização em rotas
- Armazenar em cache ou memorizar resultados computacionais caros
Perguntas frequentes
Como os decoradores lidam com as discussões?
Usando *args e **kwargs na função wrapper aninhada, que permite receber e encaminhar quaisquer parâmetros posicionais ou de palavra-chave para a função encapsulada.
Você pode aplicar vários decoradores a uma função?
Sim, você pode empilhá-los. Eles serão executados em ordem de cima para baixo (envoltório mais interno para mais externo).
Tópicos Relacionados
Domine as funções do Python. Aprenda como escrever código reutilizável usando def, definir argumentos, retornar valores e compreender o escopo local e globalmente.
Gerenciadores de contexto PythonAprenda como escrever gerenciadores de contexto personalizados em Python. Domine o decorador contextmanager e os métodos __enter__/__exit__ para segurança de recursos.
Recursos Python recomendados
Expanda seu conhecimento com tutoriais interativos relacionados, folhas de dicas e comparações de código.
Como classificar uma lista em Python
Aprenda como classificar uma lista em Python usando o método sort() e a função sorted(). Descubra exemplos de classificação de chaves personalizadas e ordem reversa.
Folha de dicas dos métodos de string Python
Um guia de referência completo para manipulação de strings em Python. Domine a formatação, pesquisa, divisão, substituição e verificação de propriedades de string.
Python vs JavaScript: qual linguagem de programação é a melhor?
Uma comparação abrangente entre Python e JavaScript. Explore diferenças de sintaxe, desempenho, casos de uso (backend versus frontend) e exemplos de codificação.