Función de cierre y su aplicación

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()

Supongo que te gusta

Origin blog.51cto.com/15129993/2676702
Recomendado
Clasificación