1.定义
装饰器是将一个函数当作参数传递给另一个函数,返回一个替代版的函数,本质就是一个返回函数的函数。
(装饰器的存在其实就是为了在需要添加新功能时不影响之前版本的使用的同时来增加新功能,其实也是一种“偷懒”的办法。)
2.使用原则
(1)在不修改被修饰函数源代码的同时为其增加功能;
(2)不能修改被装饰的函数的调用方式;
3.无参数的装饰器
1.用装饰器判断年龄:
def outer(f):
def inner(age):
if age <=0:
age = 0
f(age)
return inner #outer返回了inner()函数的引用,f指向这个引用
@outer #可以理解为将say(age)这个函数传递到f
def say(age):
print('year old:',age)
say(-1) #say()指向了inner()函数的地址,也就是say()函数调用了inner()函数
say(-10)
2.用装饰器计算函数运行时间:
import time
def decorator(func):
def Deco():
start_time = time.time()
func() #
end_time = time.time()
print("time:", end_time - start_time,'s')
return Deco
@decorator
def test():
time.sleep(1)
print("run test")
test()
3. 创建装饰器, 要求如下: 1. 创建add_log装饰器, 被装饰的函数打印日志信息; 2. 日志格式为: [字符串时间] 函数名: xxx, 运行时间:xxx, 运行返回值结果:xxx
import time
import functools
def add_log(func):
@functools.wraps(func)
def wrapper(*args,**kwargs): #接收可变参数和关键字参数
start_time = time.time() #开始运行的时刻
res = func(*args,**kwargs) #调用函数
end_time = time.time() #运行结束的时刻
print('[%s] 函数名:%s,运行时间:%.6fs,运行返回值的结果'':%d' %(time.ctime(),func.__name__,end_time-start_time,res))
return res
return wrapper
@add_log
def add(x,y):
time.sleep(1)
return x+y
add(1,10)