python装饰器理解

import time
def timer(func):
def deco(*args, **kwargs):
stat_time = time.time()
func(*args, **kwargs)
print(func)
stop_time = time.time()
print('the func run time is{}'.format(stop_time - stat_time))
return deco
# @timer
def test1():
time.sleep(2)
print('in the test1')
test1 = timer(test1)
test1()
'''
装饰器 :
要理解python装饰器,首先需要分清一个点,
函数名和函数体
函数体只是放在内存空间中的数据(和其他数据没有不同,都是电路开关状态的集合)
函数名是指向函数体储存空间的一个路标,而路标不止一个
当某个函数名改变时,这个函数名这个路标不再指向之前的函数体空间,而指向新的函数体空间
久的函数体空间不会发生变化,只是函数名的指向作用变化了
就算一个函数体空间没有任何函数名路标指向他,他也不会立刻消失,
计算机会隔一段时间去处理,并非即时的。

如上代码所示,将test1这个路标以实参的方式传给timer中的func
那么,test1和func是作用相同的,指向同一个函数体空间的路标
而这个函数体空间现在有两个函数名路标指向他
timer的返回值,deco同样也是一个指向另一个函数体空间的路标
在这个函数体空间中,有着func这个路标,这应该涉及到python的预编译
或者是实参会直接通过形参传给函数内部调用位置。
最后将返回出的deco函数名路标赋值给test1,
test1不再和func一样指向同一个函数体空间,
而是同deco一样,指向另一个函数体空间
所以此时通过test1来找函数体空间,只能找到新的函数体空间
装饰器就ok了
@timer的作用相当于test1 = timer(test1)
是开发者做的糖
'''

    推荐阅读