一、普通装饰器
a.一个输出函数名称和运行时间的装饰器
from datetime import datetime
def run_log(func):
def deco():
begin_time = datetime.now()
res = func()
finish_time = datetime.now()
print('函数名称:{}'.format(func.__name__))
print('总耗时:{}'.format(finish_time - begin_time))
return res
return deco
@run_log
def test():
return '我是函数test的返回值'
print(test())
运行结果:
函数名称:test
总耗时:0:00:00
我是函数test的返回值
b.多个装饰器
from datetime import datetime
def run_time(func):
def deco():
begin_time = datetime.now()
res = func()
finish_time = datetime.now()
print('总耗时:{}'.format(finish_time - begin_time))
return res
return deco
def func_name(func):
def deco():
res = func()
print('函数名称:{}'.format(func.__name__))
return res
return deco
@run_time
@func_name
def test():
return '我是函数test的返回值'
print(test())
运行结果:
函数名称:test
总耗时:0:00:00
我是函数test的返回值
由此可见,当函数有多个装饰器时,执行顺序为: 最后一个装饰器-->第一个装饰器
二、带参数的装饰器
有的时候需要给装饰器传递参数,让装饰器按需执行
from datetime import datetime
def run_log(para):
def demo(func):
def deco(*args, **kwargs):
if para == '打印函数名称':
res = func(*args, **kwargs)
print('函数名称:{}'.format(func.__name__))
if para == '打印运行时间':
begin_time = datetime.now()
res = func(*args, **kwargs)
finish_time = datetime.now()
print('总耗时:{}'.format(finish_time - begin_time))
return res
return deco
return demo
@run_log(para='打印函数名称')
def test1():
return '我是函数test1的返回值'
@run_log(para='打印运行时间')
def test2():
return '我是函数test2的返回值'
print(test1())
print('我是分割线线线线线线线线线线线线线线线线线线线线线线线线线线线线线线线')
print(test2())
运行结果:
函数名称:test1
我是函数test1的返回值
我是分割线线线线线线线线线线线线线线线线线线线线线线线线线线线线线线线
总耗时:0:00:00
我是函数test2的返回值
三、将函数的参数传递到装饰器上
有的时候可能我们需要将函数的参数传递到装饰器上(装饰器大多是定义用来通用的,所以这种情况使用的场景可能比较少)
a.第一种写法
def run_log(func):
def deco(*args, **kwargs):
x, y, res = func(*args, **kwargs)
print('函数名称:{},函数参数:{},{},函数结果:{}'.format(func.__name__, str(x), str(y), str(x + y)))
return x, y, res
return deco
@run_log
def test(x, y):
return x, y, x + y
print(test(3, 5))
运行结果:
函数名称:test,函数参数:3,5,函数结果:8
(3, 5, 8)
实际上就是从test方法的返回值处取得test方法的参数,传递到装饰器中,感觉没啥实际意义啊 !
b.第二种
def run_log(func):
def deco(x, y):
res = func(x, y)
print('函数名称:{},函数参数:{},{},函数结果:{}'.format(func.__name__, str(x), str(y), str(x + y)))
return res
return deco
@run_log
def test(x, y):
return '函数test的返回值:{}'.format(x + y)
print(test(3, 5))
运行结果:
函数名称:test,函数参数:3,5,函数结果:8
函数test的返回值:8
这样写的话,这个装饰器估计只能这个方法用了,感觉这样写也没啥实际意义!
有不对的地方欢迎指正哦!!!