今天其实也有人问到了python装饰器是什么,一下子我也被问得有点懵逼了,有些基础的理论确实忘了,然而因为也是自己写的代码,也没有去做所谓的核心代码的区别,但是重新看了一下理论,还是知道了大概的一个作用是什么。
Python装饰器就是用于拓展原来函数的一种函数,在不改动原函数的代码的前提下给函数增加新的功能,这也是代码可拓展性保证了核心代码不被破坏的重要函数。而这个函数的特殊之处也是在于他的返回值也是一个函数。
一般来说,想要拓展原来的函数代码,最直接的办法就是修改原先的代码,倾入原先的代码进行修改。
例如:这个是个简单输出hello world的一个函数
import time def func(): print("hello") time.sleep(1) print("world")
现在的需求是,我们要记录一下,这个函数执行的总时间,当然最简单的方法就是:
在原有的代码上去加一些代码条件,包括去记录开始时间和结束时间,以此来计算出一个总时间。
import time def func(): startTime = time.time() print("hello") time.sleep(1) print("world") endTime = time.time() msecs = (endTime - startTime)*1000 print("time is %d ms" %msecs)
这样一来是不是比较简单,但是别慌啊,好戏在后头。在一些公司,可能这个代码不是你写的,但是现在好比说这个代码,主管(BOSS)跟你说,这段代码是核心代码,不能直接改核心代码,想办法去增加功能!
这个时候,装饰器就派上用场了,现在,我自己重新加了一个装饰器去写
import time def deco(func): def wrapper(): start_time = time.time() func() end_time = time.time() timer = end_time - start_time print("run time spend :", timer, ‘s‘, sep=‘‘) return wrapper @deco def func(): print("hello") time.sleep(1) print("world") func()
可以看到,我们定义了一个函数deco,然后它的参数是一个函数,然后增了一个计时的功能。
有些人可能不明白,这个@deco是什么意思呢?
其实@deco 就是引用装饰器,相当于func = deco(func),是的,然后deco其实就是一个装饰器
而这里调用的方式其实还是跟之前一样
装饰器的意义:装饰器在不改变被装饰函数的源代码和调用方式的情况下增加新的功能,所以即便是修改了原先的调用方式也是不行。
这样就可以在不动用核心代码的基础上去拓展它的函数功能!
好了,这篇就输出到这里
原文:https://www.cnblogs.com/duanminkid/p/14787083.html