decorador de python (modificador)

El papel de los decoradores

La función del decorador de funciones de Python @ es agregar funciones adicionales a las funciones existentes, que a menudo se utilizan para la inserción de registros, pruebas de rendimiento, procesamiento de transacciones, etc.

Lógica de procesamiento del decorador

Cuando el intérprete lee un decorador como @, primero analizará el contenido después de @, usará la función o clase en la siguiente línea de @ como el parámetro de la función detrás de @, y luego asignará el valor de retorno al objeto de función modificado en la siguiente linea

Reglas para crear modificadores de funciones

(1) El modificador es una función
(2) El modificador toma la función modificada como un parámetro
(3) El modificador devuelve una nueva función
(4) El modificador mantiene la firma de la función mantenida

por ejemplo

Ejemplo 1: la función modificada no toma parámetros

def log(func):
    def wrapper():
        print('log开始 ...')
        func()
        print('log结束 ...')
    return wrapper
    
@log
def test():
    print('test ..')

test()

resultado de la operación:

log开始 ...
test ..
log结束 ...

Ejemplo 2: la función modificada toma parámetros

from functools import wraps

def log(func):
    @wraps(func)
    def wrapper(*args,**kwargs):
        print('log开始 ...',func.__name__)
        ret = func(*args,**kwargs)
        print('log结束 ...')
        return ret
    return wrapper
    
@log
def test1(s):
    print('test1 ..', s)
    return s

@log
def test2(s1, s2):
    print('test2 ..', s1, s2)
    return s1 + s2


test1('a')
test2('a','bc')

resultado de la operación:

log开始 ... test1
test1 .. a
log结束 ...
log开始 ... test2
test2 .. a bc
log结束 ...

Ejemplo 3: los modificadores tienen parámetros y deben incluirse más que en el ejemplo anterior

from functools import wraps

def log(arg):    
    def _log(func):
        @wraps(func)
        def wrapper(*args,**kwargs):
            print('log开始 ...',func.__name__, arg)            
            ret = func(*args,**kwargs)
            print('log结束 ...')
            return ret
        return wrapper
    return _log
 
@log('module1')
def test1(s):
    print('test1 ..', s)
    return s

@log('module1')
def test2(s1, s2):
    print('test2 ..', s1, s2)
    return s1 + s2


test1('a')
test2('a','bc')

resultado de la operación:

log开始 ... test1 module1
test1 .. a
log结束 ...
log开始 ... test2 module1
test2 .. a bc
log结束 ...

Supongo que te gusta

Origin blog.csdn.net/baidu_24752135/article/details/114636000
Recomendado
Clasificación