python装饰器
1.闭包:
def func():
print('this is func')
def func_inner():
print('this is inner')
# func函数执行之前返回内部函数引用
return func_inner
a = func()
# 调用内部函数
a()
#输出:
this is func
this is inner
# 装饰器1 不带参数的装饰器
# func入参是函数,就是下面的say_what
def func(fun):
# 装饰器外部,打印圣诞节快乐
print('圣诞节快乐')
# 内部函数,只调用入参的fun,也就是say_what
def func_inner():
# 执行入参的函数say_what
fun()
# 返回内部函数的调用
return func_inner
# 使用装饰器
@func
def say_what():
print('您好,欢迎光临')
say_what()
#先执行装饰器外部函数,打印圣诞节快乐,然后执行装饰器入参的函数say_what
#圣诞节快乐
#您好,欢迎光临
#装饰器2 带参数的装饰器
from functools import wraps
# 接收外部传入的函数say_hello
def func(fun):
print('圣诞节快乐')
# 保留原有函数的注解和函数名,如果不使用这个,拿到的都是装饰器的函数和函数名
@wraps(fun)
# 接收外部函数say_hello传进来的参数
def func_inner(*args, **kwargs):
# 保证被装饰的函数的结果可以被取到
return fun(*args, **kwargs)
# 内部函数的引用返回,返回给装饰器,保证被装饰函数正常被执行
return func_inner
@func
def say_hello(a, b):
'xxxxx'
print('您好,欢迎光临')
return a + b
print(say_hello(1, 2))
#输出:
圣诞节快乐
您好,欢迎光临
3
# 创建装饰器,要求如下:
# 1).创建add_log装饰器,被装饰的函数打印日志信息;
# 2).日志格式为:函数名:xxx,运行时间:xxx,运行返回值结果:xxx
def record_time(fun):
def warp(*args, **kwargs):
start = time.time()
a = fun(*args, **kwargs)
end = time.time()
print(end - start)
return a
return warp
@record_time
def A(a, b):
time.sleep(3)
return a + b
print(A(2, 3))