python装饰器有那么难吗
经常在很多的网站上或者学习资料上看到python装饰器这个东西。
啊,感觉说的非常复杂,非常麻烦,介绍一大堆,把我都看糊涂了,我就在想,就一个包装函数的东西,有那么麻烦吗?
案例说明
现在我们有这样的一个需求,计算一个函数的运行时间。那我们应该怎么做?
比如我们这个函数就很复杂:
def myrun(a, b, c):
sleep(2)
return a + b + c
需要计算这个函数的运行时间。那么我们使用装饰器可以这么做:
# part1
from functools import wraps
from datetime import datetime
from time import sleep
# part2
def calruntime(f):
@wraps(f)
def wrapper(*args, **kwargs):
# part3
print(f"start run datetime: {datetime.now()}")
value = f(*args, **kwargs)
print(f"end run dateime: {datetime.now()}")
return value
return wrapper
#part4
@ calruntime
def myrun(a, b, c):
sleep(2)
return a + b + c
# part5
if __name__ == "__main__":
# part6
a = myrun(a=1, b=2, c=3)
print(a)
看到上面的代码了吗?
1. 在`part1`中,从`functools`里面导出`wraps`函数,这个我们是在下面用来装饰函数的。
2. 在`part2`中,我们将一个函数传`f`递进去,然后这个在`part3`中的`wrapper`函数中使用,`wrapper`会把这个结果输出来,然后`calruntime`把`warpper`这个函数对象输出来。
3. `part3`中的`wrapper`使用了`args`,`kargs`之类的,就是希望不要影响`myrun`函数使用参数,不然参数传递少了,`myrun`函数回很生气。
结束
没错,就是这么简单,
按照我上面的过程,把代码大概写一写就理解了。
如果不太懂的,百度一下,有很多大佬写的很详细~~