从一个小例子来了解装饰器,现要统计一个函数执行耗时:
原始版本
问题:上述代码可以完成这个功能,但之后会发现,如果我们要统计其它函数,就必须在每个函数前后加入相应代码。
装饰器版本 1(无参数)
从上述代码可以看到,使用了另一个函数 execute_time
给我们要统计耗时的函数进行了包装。此时,这个 execute_time
函数就叫做装饰器函数,而我们要统计的那个函数也就是 do_something
函数就是被装饰的函数。
问题:函数执行的时候实际上是调用的 execute_time
函数中的 inner
函数,这种方法虽然解决了原始版本的问题,但是当我们要统计的函数拥有返回值的时候,这时候我们获取不到返回值。
装饰器版本 2(有固定参数)
为了解决装饰器版本 1 的问题,我在 inner
函数里面加了个返回值。
问题:当被装饰函数的参数个数与 inner
参数个数不同时,这个装饰器就不适用了。
装饰器版本 3(动态参数)
在之前有个动态参数的知识点,正好可以解决上一步的问题。
终极版本(语法糖 @)
对于装饰器,python 内部给我们提供了语法糖支持。在需要被装饰的函数名上部使用 @装饰器函数名称
即可。
评论区