Función cerrada: función cerrada => define la función dentro de la función; la característica de la función cerrada es que solo se puede usar dentro de la función
def outter():
x = 100
def wrapper():
print(x)
Función de paquete: la función se refiere a un nombre, que es un
resumen del nivel e : una función de cierre se refiere a una función definida dentro de una función que se refiere a una
función de cierre de nombre desde el alcance de una función externa Actualización: Combinar objetos de función
def outter():
x = 100
def wrapper():
print(x)
return wrapper # 千万不要加括号
f = outter()
print(f)
def foo():
x = 666
f()
foo()
Función de cierre de aprendizaje Aprendí una nueva solución
para pasar parámetros al cuerpo de la función. Hay dos soluciones para pasar parámetros al cuerpo de la función.
Solución 1: Pasarlo directamente en forma de parámetros.
def wrapper(x):
print(x)
wrapper(100)
Opción II:
def outter(x):
def wrapper():
print(x)
return wrapper # 千万不要加括号
f = outter(100)
f()
Aplicación de la función de cierre-Decorador
1. ¿Qué es un decorador? Un
decorador se refiere a una herramienta para decorar objetos. La decoración se refiere a agregar nuevas funciones al objeto decorado.
Sin embargo, el principio que se debe seguir para implementar decoradores es "abierto y cerrado "El principio de"
abierto "se refiere a estar abierto a la expansión de nuevas funciones, y cerrado se refiere a estar cerrado a modificar el código fuente y los métodos de llamada. El
decorador general se refiere a la creación de una herramienta que puede seguir los principios 1 y 2 bajo el premisa de, puede agregar nuevas funciones al objeto decorado
Principio 1. No modificar el código fuente del objeto decorado
2. No modificar el método de llamada del objeto decorado
2. Por qué utilizar el decorador para
hacer esto. Si hay un problema con la actualización de la nueva función, puede estabilizar rápidamente
3. Cómo implementar decorador
decorador ---------- función
objeto decorado ------- función
Listo para ser decorado
import time
def index():
print('from index')
time.sleep(3)
index()
La solución uno cambió el código fuente
import time
def index():
start = time.time()
print('from index')
time.sleep(3)
end = time.time()
print(f"run time is {end - start}")
index()
Esquema 2 La función del decorador debe escribirse repetidamente, lo que da como resultado una redundancia de código
import time
def index():
print('from index')
time.sleep(3)
start = time.time()
index()
end = time.time()
print(f"run time is {end - start}")
Esquema 3 El método de llamada ha cambiado y el código se ha escrito inactivo
import time
def index():
print('from index')
time.sleep(3)
def wrapper():
start = time.time()
index()
end = time.time()
print(f"run time is {end - start}")
wrapper()
Opción cuatro
import time
def index():
print('from index')
time.sleep(3)
def outter(index):
def wrapper():
start = time.time()
index()
end = time.time()
print(f"run time is {end - start}")
return wrapper
index = outter(index)
index()
Opción cinco
import time
def index():
print('from index')
time.sleep(3)
def home(name):
print(f"welcome {name} to home page")
time.sleep(0.5)
def outter(func):
def wrapper(*args, **kwargs):
start = time.time()
res = func(*args, **kwargs)
end = time.time()
print(f"run time is {end - start}")
return (res)
return wrapper
home = outter(home)
index = outter(index)
res = home('holmes')
print(res)
index()
Azúcar sintáctico decorador
import time
def outter(func):
def wrapper(*args, **kwargs):
start = time.time()
res = func(*args, **kwargs)
end = time.time()
print(f"run time is {end - start}")
return (res)
return wrapper
@outter
def index():
print("from index")
time.sleep(3)
@outter
def home(name):
print(f"welcome {name} to xinjiang")
time.sleep(0.5)
res = home('holmes')
print(res)
index()
Plantilla de decorador
def deco(func):
def wrapper(*args,**kwargs):
res=func(*args,**kwargs)
return res
return wrapper
Decorador de inicio de sesión de usuario
def auth(func):
def wrapper(*args, **kwargs):
inp_name = input('username:').strip()
inp_pwd = input('password:').strip()
if inp_name == 'lu' and inp_pwd == '345':
res = func(*args, **kwargs)
return res
else:
print('登陆失败')
return wrapper
@auth
def index():
print('from index')
time.sleep(3)
index()
Decorador de tiempo
import time
def timmer(func):
def wrapper1(*args, **kwargs):
start = time.time()
res = func(*args, **kwargs)
stop = time.time()
print(stop - start)
return res
return wrapper1
Aplicación de decorador
import time
def timmer(func):
def wrapper1(*args, **kwargs):
start = time.time()
res = func(*args, **kwargs)
stop = time.time()
print(stop - start)
return res
return wrapper1
def auth(func):
def wrapper2(*args, **kwargs):
inp_user = input('Username: ').strip()
inp_pwd = input('Password: ').strip()
if inp_user == 'egon' and inp_pwd == '123':
res = func(*args, **kwargs)
return res
else:
print('登录失败')
return wrapper2
@auth
@timmer
def index():
print('====>index')
time.sleep(3)
index()