Decoradores em Python: Como Funcionam e Exemplos Práticos

Ana Maria Gomes
5 minutos de leitura

Conteúdos do tutorial

Os decoradores em Python são uma ferramenta poderosa que permite modificar o comportamento de funções ou métodos sem alterar seu código-fonte. Eles são amplamente utilizados para adicionar funcionalidades de forma elegante e eficiente. Neste tutorial, vamos explorar como os decoradores funcionam e demonstrar com exemplos práticos.

O que são Decoradores em Python?

Em poucas palavras, decoradores modificam a forma com que uma função opera, porém sem mudar a lógica da função em si. Eles ajudam a tornar seu código mais curto e mais “Pythonico”. Podemos pensar em decoradores como algo que “adiciona utilidade extra” a alguma função já existente.

Funções são Objetos em Python

Para entender decoradores, é essencial saber que funções em Python são objetos. Isso significa que elas podem ser assinaladas para alguma variável e passadas como argumento de outra função.

def func():
    return 2

minha_funcao = func
retorno = minha_funcao()

print(retorno)
# output: 2
Testar

Passando Funções como Argumentos

Podemos passar funções como argumentos para outras funções, o que é a base para criar decoradores.

def exibe_func(f):
    print(f'Objeto de função recebido: {f}')
    print(f'Nome da função: "{f.__name__}"')

exibe_func(func)

Criando um Decorador

Vamos criar um decorador simples que converte o retorno de uma função para letras maiúsculas.

def meu_decorador(func):
    def meu_pacote(*args, **kwargs):
        retorno = func(*args, **kwargs)
        return retorno.upper()
    return meu_pacote

@meu_decorador
def dizer_oi(nome):
    return f'Olá, {nome}!'

print(dizer_oi('Juliano'))
# output: OLÁ, JULIANO!
Testar

Explicação do Código

  1. Definição do Decorador: Criamos uma função meu_decorador que aceita uma função func como argumento.
  2. Função Interna: Dentro de meu_decorador, definimos meu_pacote, que chama func e converte seu retorno para maiúsculas.
  3. Retorno do Decorador: meu_decorador retorna meu_pacote, que é a função decorada.
  4. Uso do Decorador: Utilizamos @meu_decorador acima da definição da função dizer_oi, aplicando o decorador.

Decoradores com Argumentos

Podemos criar decoradores que aceitam argumentos. Vamos criar um decorador que repete a execução de uma função um número específico de vezes.

def repetir_vezes(n):
    def decorador(func):
        def wrapper(*args, **kwargs):
            for _ in range(n):
                resultado = func(*args, **kwargs)
            return resultado
        return wrapper
    return decorador

@repetir_vezes(3)
def dizer_oi(nome):
    print(f'Olá, {nome}!')

dizer_oi('Juliano')
# output:
# Olá, Juliano!
# Olá, Juliano!
# Olá, Juliano!
Testar

Explicação do Código

  1. Definição do Decorador com Argumentos: repetir_vezes aceita um argumento n e retorna o decorador decorador.
  2. Função Interna: decorador define wrapper, que executa func n vezes.
  3. Uso do Decorador: Utilizamos @repetir_vezes(3) para aplicar o decorador à função dizer_oi.

Decoradores Aninhados

Podemos aplicar múltiplos decoradores a uma função. Vamos criar dois decoradores e aplicá-los a uma função.

def maiusculas(func):
    def wrapper(*args, **kwargs):
        retorno = func(*args, **kwargs)
        return retorno.upper()
    return wrapper

def repetir(func):
    def wrapper(*args, **kwargs):
        resultado = func(*args, **kwargs)
        return resultado * 2
    return wrapper

@repetir
@maiusculas
def saudacao(nome):
    return f'Olá, {nome}!'

print(saudacao('Juliano'))
# output: OLÁ, JULIANO!OLÁ, JULIANO!
Testar

Explicação do Código

  1. Definição dos Decoradores: maiusculas converte o retorno para maiúsculas e repetir duplica o retorno.
  2. Uso dos Decoradores: Utilizamos @repetir e @maiusculas para aplicar ambos os decoradores à função saudacao.

Conclusão

Os decoradores em Python são uma ferramenta poderosa para modificar o comportamento de funções de forma elegante e eficiente. Eles permitem adicionar funcionalidades sem alterar o código-fonte das funções originais. Compreender e utilizar decoradores pode tornar seu código mais modular e reutilizável.

Experimente criar seus próprios decoradores e explore as possibilidades que eles oferecem para tornar seu código mais Pythonico e eficiente!

Inscreva-se gratuitamente e fique atualizado

Receba toda semana um resumo dos principais conteúdos da Asimov direto no seu e-mail. 100% livre de spam.

Áreas de interesse: