装饰器:
把一个函数当作参数,返回一个替代版的函数
本质上就是一个返回函数的函数
“在不改变原函数的基础上,给函数增加功能”
导入模块
关键字红线Alt+回车
练习:
装饰器实现一个函数计时器
import time
import functools
def timetest(fun):
"""This is a decorator fun"""
@functools.wraps(fun)
def wrapper(*args,**kwargs):
"""This is a wrapper function"""
start_time = time.time()
res = fun(*args,**kwargs)
end_time = time.time()
print('Running time is: %.6f' %(end_time - start_time))
return res
return wrapper
@timetest
def fun_list(n):
"""This is the fun_list function"""
return [2 * i for i in range(n)]
@timetest
def fun_map(n):
"""This is the fun_map function"""
return list(map(lambda x:x*2,range(n)))
print(fun_list(1000))
print(fun_map(1000))
创建装饰器, 要求如下:
- 创建add_log装饰器, 被装饰的函数打印日志信息;
- 日志格式为: [字符串时间] 函数名: xxx, 运行时间:xxx, 运行返回值结果:xxx
编写装饰器required_types, 条件如下:
1). 当装饰器为@required_types(int,float)确保函数接收到的每一>个参数都是int或者float类型;
2). 当装饰器为@required_types(list)确保函数接收到的每一个参数都是list类型;
3). 当装饰器为@required_types(str,int)确保函数接收到的每一个>参数都是str或者int类型;
4). 如果参数不满足条件, 打印 TypeError:参数必须为xxxx类型
required_typs(*kind) #接收装饰器参数
判断参数是何种类型
多个装饰器
顺序:从上往下