5.1 Conhecendo os decoradores
Decoradores são funções que recebem outra função como argumento e retornam uma nova função, modificando ou ampliando o comportamento da função original. Os decoradores são usados para melhorar a legibilidade e a reutilização de código.
Decoradores permitem modificar o comportamento de funções ou métodos sem alterar seu código original. Por isso, são amplamente utilizados para adicionar funcionalidades, fazer logging, controlar acesso e para muitas outras tarefas.
A sintaxe dos decoradores em Python inclui o uso do símbolo @ antes do nome do decorador, que é colocado antes da definição da função.
@decorator
def my_function():
pass
Isso é equivalente ao seguinte código:
def my_function():
pass
my_function = decorator(my_function)
Pense bem no que está acontecendo aqui: declaramos a função
my_function
, mas depois a substituímos pela função decorator
, onde nossa
função é passada como parâmetro. A função
decorator
pode chamar nossa função como quiser.
5.2 Criando um decorador simples
Vamos ver um decorador simples que exibe uma mensagem antes e depois de chamar a função.
def my_decorator(func):
def wrapper():
print("Antes de chamar a função")
func()
print("Depois de chamar a função")
return wrapper
@my_decorator
def say_hello():
print("Hello!")
say_hello()
Explicação
Decorador (my_decorator)
: Esta função recebe a função func
como
argumento e retorna uma nova função wrapper
, que
chama func
e adiciona comportamento extra antes e depois de sua
execução.
Função com decorador (say_hello)
: A função say_hello
é decorada com o
my_decorator
, o que adiciona comportamento extra quando é chamada.
Saída:
# Antes de chamar a função
Hello!
# Depois de chamar a função
5.3 Decoradores com argumentos
Os decoradores podem receber argumentos, permitindo ajustar seu comportamento de forma flexível.
def repeat(num_times):
def decorator_repeat(func):
def wrapper(*args, **kwargs):
for _ in range(num_times):
func(*args, **kwargs)
return wrapper
return decorator_repeat
@repeat(num_times=3)
def say_hello(name):
print(f"Hello, {name}!")
say_hello("Alice")
Explicação
Decorador com argumentos (repeat)
: Esta função recebe um argumento num_times
e retorna
o decorador decorator_repeat
.
Decorador (decorator_repeat)
: Este decorador recebe a função func
e retorna uma nova função wrapper
, que
chama func
num_times
vezes.
Função com decorador (say_hello)
: A função say_hello
é chamada três vezes graças ao decorador repeat
.
Saída:
Hello, Alice!
Hello, Alice!
Hello, Alice!
GO TO FULL VERSION