Decoradores de classe Python

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 starfunçã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 decorateLinguagem 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 starfá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 starfá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 wrapperLinguagem de código:  Python  ( python )

E você pode usar a Starclasse como decoradora assim:

@Star(5)
def add(a, b):
    return a + bLinguagem de código:  Python  ( python )

O @Star(5)retorna uma instância da Starclasse. 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.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *