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.

Experimente no Editor

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)
Saída terminal
Calling multiply with args: (5, 4)
multiply returned: 20

Implementaçã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

Recursos Python recomendados

Expanda seu conhecimento com tutoriais interativos relacionados, folhas de dicas e comparações de código.