A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

今天学习了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的引用丢失,成为了自由变量


3 个回复

倒序浏览
能坚持学习的人都是最棒的。
回复 使用道具 举报
做一个自由又自律的人,靠势必实现的决心认真地活着。
回复 使用道具 举报
大多数人想要改造这个世界,但却罕有人想改造自己。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马