装饰器
装饰器(decorator)
-
装饰器本质上是一个python函数,他可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。
-
应用场景:插入日志,性能测试,事务处理,缓存,权限校验
-
作用:为了已经存在的函数或者对象添加额外的功能
例子1: def w1(func): def inner(): #可以加if判断 print("---验证---") func() return inner #f1=w1(f1) @w1 def f1(): print('f1') #调用 f1()
双层装饰器
-
装饰是从下装到上,调用是从上到下。
def w1(func): print("--正在装饰1--") def inner(): print("--正在验证1--") func() return inner def w2(func): print("--正在装饰2--") def inner(): print("--正在验证2--") func() return inner @w1 @w2 def f1(): print("--f1--") #装饰倒着装,调用是从上到下。 f1() ###执行结果### --正在装饰2-- --正在装饰1-- --正在验证1-- --正在验证2-- --f1--
装饰器不定长参数
from time import ctime, sleep
def timefun(func):
#给函数传参数
def wrappedfunc(*args,**kw):
print("%s called at %s"%(func.__name__, ctime()))
func(*args,*kw)
return wrappedfunc
@timefun
def foo(a,b,c):
print(a+b+c)
foo(1,2,3)
foo called at Tue Jan 1 17:16:15 2019
6
装饰器return
def func(fun):
def func_in(*args,**kwargs):
#ret保存return 返回值,如果没有返回值为None
ret = fun(*args,**kwargs)
return ret
return func_in
@func
def 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()
@Test
def test():
print("---test--")
test()
--打印结果--
---初始化--
func name is test
--装饰器中的功能---
---test--
得到了不该得到的得到,就会失去不该失去的失去!
忍受别人不能忍受的忍受,就能享受别人不能享受的享受!