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结束 ...