装饰器(decorator)
装饰器本质上是一个python函数,他可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。
应用场景:插入日志,性能测试,事务处理,缓存,权限校验
作用:为了已经存在的函数或者对象添加额外的功能
例子1:def w1(func): def inner(): #可以加if判断 print("---验证---") func() return inner#f1=w1(f1)@w1def f1(): print('f1')#调用f1()
双层装饰器
装饰是从下装到上,调用是从上到下。
def w1(func): print("--正在装饰1--") def inner(): print("--正在验证1--") func() return innerdef w2(func): print("--正在装饰2--") def inner(): print("--正在验证2--") func() return inner@w1@w2def f1(): print("--f1--")#装饰倒着装,调用是从上到下。f1()###执行结果###--正在装饰2----正在装饰1----正在验证1----正在验证2----f1--
装饰器不定长参数
from time import ctime, sleepdef timefun(func): #给函数传参数 def wrappedfunc(*args,**kw): print("%s called at %s"%(func.__name__, ctime())) func(*args,*kw) return wrappedfunc@timefundef foo(a,b,c): print(a+b+c)foo(1,2,3)foo called at Tue Jan 1 17:16:15 20196
装饰器return
def func(fun): def func_in(*args,**kwargs): #ret保存return 返回值,如果没有返回值为None ret = fun(*args,**kwargs) return ret return func_in@funcdef test(args): print("---%s--"%(args)) return "haha"print(test(1))
装饰器带参数
def func_arg(arg): def fun(fun): def func(): print("--记录日志--%s"%(arg)) if arg=="heihei": fun() else: pass return func return fun#1.先执行func_arg函数,return 结果是这个fun函数#等于使用@fun 对test进行装饰@func_arg("heihei")def test(): print("--test--")test()--记录日志--heihei--test--
类装饰器
class test(object): #重写这个call方法,让类加上()就可以被调用。 def __call__(self): print("--test--")t = test()t()--打印结果----test--######类装饰器class Test(object): def __init__(self,func): print("---初始化--") print("func name is %s"%(func.__name__)) self.__func = func def __call__(self): print("--装饰器中的功能---") self.__func()@Testdef test(): print("---test--")test()--打印结果-----初始化--func name is test--装饰器中的功能------test--