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))
 
posted @ 2021-01-20 02:08  maxwell11  阅读(91)  评论(0编辑  收藏  举报