Resumo : neste tutorial, você aprenderá sobre decoradores de classes Python. Após o tutorial, você saberá como definir classes como decoradores.
Introdução aos decoradores de classes Python
Até agora você aprendeu como usar funções para definir decoradores .
Por exemplo, a star
função a seguir imprime vários *
caracteres antes e depois de chamar a função decorada:
def star(n):
def decorate(fn):
def wrapper(*args, **kwargs):
print(n*'*')
result = fn(*args, **kwargs)
print(result)
print(n*'*')
return result
return wrapper
return decorate
Linguagem de código: Python ( python )
A star
é uma fábrica de decoradores que retorna decorador. Aceita um argumento que especifica o número de *
caracteres a serem exibidos.
O seguinte ilustra como usar a star
fábrica de decoradores:
@star(5)
def add(a, b):
return a + b
add(10, 20)
Linguagem de código: Python ( python )
Saída:
*****
30
*****
A star()
fábrica de decoradores recebe um argumento e retorna uma chamada. O callable recebe um argumento ( fn
) que é uma função que será decorada. Além disso, o callable pode acessar o argumento ( n
) passado para a fábrica do decorador.
Uma instância de classe pode ser chamada quando implementa o __call__
método. Portanto, você pode fazer o __call__
método como decorador.
O exemplo a seguir reescreve a star
fábrica de decoradores usando uma classe:
class Star:
def __init__(self, n):
self.n = n
def __call__(self, fn):
def wrapper(*args, **kwargs):
print(self.n*'*')
result = fn(*args, **kwargs)
print(result)
print(self.n*'*')
return result
return wrapper
Linguagem de código: Python ( python )
E você pode usar a Star
classe como decoradora assim:
@Star(5)
def add(a, b):
return a + b
Linguagem de código: Python ( python )
O @Star(5)
retorna uma instância da Star
classe. Essa instância pode ser chamada, então você pode fazer algo como:
add = Star(5)(add)
Linguagem de código: Python ( python )
Portanto, você pode usar classes que podem ser chamadas para decorar funções.
Junte tudo:
from functools import wraps
class Star:
def __init__(self, n):
self.n = n
def __call__(self, fn):
@wraps(fn)
def wrapper(*args, **kwargs):
print(self.n*'*')
result = fn(*args, **kwargs)
print(result)
print(self.n*'*')
return result
return wrapper
@Star(5)
def add(a, b):
return a + b
add(10, 20)
Linguagem de código: Python ( python )
Resumo
- Use classes que podem ser chamadas como decoradores implementando o
__call__
método. - Passe os argumentos do decorador para o
__init__
método.