一行代码能轻松编写装饰器么,当然不能,但实际的工作量和一行代码真的没有太多区别,先看一个常规方法编写的装饰器
def cost(func):
def warpper(*args, **kwargs):
t1 = time.time()
res = func(*args, **kwargs)
t2 = time.time()
print(func.__name__ + "执行耗时" + str(t2-t1))
return res
return warpper
@cost
def test_cost(sleep):
time.sleep(sleep)
test_cost(2)
很多人被装饰器的闭包概念搞的死去活来,不能理解一切皆对象的概念,别说写一个装饰器,就是看一个装饰器都不能理解其中之意。
得益于python强大的社区,有人写出了一个模块,可以让你轻松写出一个装饰器,该模块安装命令为 pip3 install decorator
使用起来,极为简单
import time
from decorator import decorator
@decorator
def cost(func, *args, **kw):
t1 = time.time()
res = func(*args, **kw)
t2 = time.time()
print(func.__name__ + "执行耗时", t2-t1)
return res
@cost
def test_cost(sleep):
time.sleep(sleep)
test_cost(2)
cost函数被decorator装饰,cost就变成了一个装饰器,第一个参数必须传入函数,就是你希望被cost装饰的函数,*args 和 **kw 是用来传给func的参数,如果你想写一个带参数的装饰器,同样很简单
import time
from decorator import decorator
@decorator
def cost(func, timelimit=3, *args, **kw):
t1 = time.time()
res = func(*args, **kw)
t2 = time.time()
# 只打印运行时长超过timelimit的函数
if (t2-t1) > timelimit:
print(func.__name__ + "执行耗时", t2-t1)
return res
@cost
def test_cost(sleep):
time.sleep(sleep)
test_cost(3)
QQ交流群: 211426309