装饰器:
函数当作参数,返回替代版本的函数
本质就是一个返回函数的函数
作用:不改变原函数的基础上给函数增加功能
import time
def decorator(func):
def wrapper():
func()
print(time.strftime('%Y-%m-%d'))
return wrapper
@decorator
def f1():
print("Now print time...")
# f = decorator(f1)
f1()
可以在定义函数是添加位置参数、关键字参数等
def add_log(add):
@functools.wraps(add)
def add_func(*args):
begin = time.time()
res = add(*args)
end = time.time()
print('['+time.strftime('%Y-%m-%d %H:%M:%S')+']' +
'\n函数名:'+str(add).split()[1] +
'\n运行时间:'+str(round(end-begin, 6)) +
'\n运行返回值结果:'+str(res))
return add_func
打印帮助文档和程序信息
@functools.wraps(func)
当需要向装饰器内添加参数时,可以在外面嵌套函数
def required_types(*ARG):
def types(JudgeArgs):
@functools.wraps(JudgeArgs)
def judge(*args, **kwargs):
for N in args:
if not isinstance(N, ARG):
print(str(N) + "TypeError")
break
else:
res = JudgeArgs(*args,**kwargs)
return res
return judge
return types
@required_types(int, float)
def JudgeArgs(*args):
res = sum(*args)
return res
print(JudgeArgs(1, [1, 2, 3]))
如果有多个装饰器,则从内向外执行装饰器
def addNum1(addNum):
def change():
addNum()
print("hello")
return change
def addNum2(addNum):
def change():
addNum()
print("world")
return change
@addNum1
@addNum2
def addNum():
return 1 + 1
print(addNum())
raise可以显示引发异常
raise NameError