今天学习了python的一个很重要的只是点-装饰器,下面分享一下我自己的学习理解和笔记,大家一起学习.1.函数名和变量名一样是函数代码空间的引用,当一个函数名赋给一个变量时就是把引用复制给此变量
######################################
def fun():
pass
ret = fun # fun函数的引用赋给ret变量
print(id(ret) == id(fun)) # 输出为true
######################################
fun表示函数空间的地址引用
fun()加括号表示执行fun函数
2.定义并使用一个装饰器
##############################
def spend_time(fun): # 定义一个计算函数执行时间的装饰器
print("haha") # 这一句在@之后就会执行输出哈哈
def inner(n): # 实际的执行内嵌函数
time1 = time.time()
fun(n) # 在被装饰函数前后加上时间函数
time2 = time.time()
print(time2-time1)
return inner # 返回内嵌函数的引用
@spend_time
def fun1(n): # 被装饰函数的上面加上 @装饰器 就可以完成装饰
time.sleep(n)
fun1(2) # 调用fun1(2)会发现输出2.0000451555124
##############################
以上代码的执行顺序:
1.加载spend_time到内存,因为没有调用会发现inner没有被执行
2.执行@spend_time:
(1) 执行spend_time,打印哈哈,将加载inner函数,内部包含fun函数的引用,然后返回inner函数的引用
(2) 返回将inner函数的引用赋给@下面的函数,即fun1 = spend_time(fun)= inner
(3) 若执行fun1(2) 将变成执行inner(2)
**以上原来的函数fun1的引用丢失,成为了自由变量
|
|