装饰器
程序员文章站
2022-06-30 14:13:41
...
本节在这里和大家展示一下装饰器的使用,以及原理
装饰器是程序开发中经常会用到的一个功能,用好了装饰器,开发效率如虎添翼,所以这也是Python面试中必问的问题,但对于好多初次接触这个知识的人来讲,这个功能有点绕,自学时直接绕过去了,然后面试问到了就挂了,因为装饰器是程序开发的基础知识,这个都不会,别跟人家说你会Python
当你在公司里调试代码的时候,发现以下代码的运行时间过长,于是你意识到可能有需要优化的地方:
def func1():
pass
def func2():
pass
def func3():
pass
def func4():
pass
但是写代码要遵循开放封闭原则,虽然在这个原则是用的面向对象开发,但是也适用于函数式编程,简单来说,它规定已经实现的功能代码不允许被修改,但可以被扩展,即:封闭:已实现的功能代码块
开放:对扩展开发
所以,你不能直接在每个函数内部进行调试,以免破坏代码的稳定性。但是,在每个调用函数的前后执行的计时操作的话,如果函数量足够大的话,会造成代码量的冗余,且浪费时间。那么,这个时候该如何进行代码的检查呢?这里就可以用到装饰器了:
import time
def check_time(func):
def inner_func():
start_time = time.time()
res = func() # 调用原函数,并获得原函数的返回值
end_time = time.time()
time_consuming = end_time - start_time # 计算耗时时间
print("函数 < %s > 总共耗时 %s"%(func.__name__,time_consuming))
return res 返回原函数的返回值
return inner_func # 返回内部函数的引用
@check_time
def func1():
pass
@check_time
def func2():
pass
@check_time
def func3():
pass
@check_time
def func4():
pass
这样,就能在不该变原函数的代码结构的情况下,就能对每个函数的执行耗时情况一目了然了。
那么,装饰器既然可以这样使用,那么他的使用原理是什么呢?
装饰器的几大功能:
- 引入日志
- 函数执行时间统计
- 执行函数前预备处理
- 执行函数后清理功能
- 权限校验等场景
- 缓存
在工作中,装饰器的使用时必须的,一个合格的员工都应该了解和掌握装饰器。其实,装饰器不仅仅局限于用函数进行装饰,还有类当装饰器,下面是我用类装饰器写的一段代码,大家可以参考一下:
class A(object):
""" 将A充当类装饰器 """
def __init__(self,func):
self.func = func
def __call__(self, *args, **kwargs):
print("类装饰器开始执行啦--------")
self.func()
print("类装饰器执行结束啦--------")
@A
def test():
print("this is test!")
test()
装饰器其实还有很多用法和复杂的装饰器,比如装饰器传参啊,还有几个装饰器共同装饰同一个函数等等。只不过因为时间和篇幅有限,今天就先到这里了,感谢大家的阅读!