1 import time 2 #装饰器 1、函数即变量 2、高阶函数 3、嵌套函数 3个知识点组成装饰器 3 #变量 变量名是变量地址,变量内容存在对应内存地址的内存空间内 函数即变量最典型的例子:匿名函数 4 cal = lambda x:x**2 #匿名函数体本身相当于函数定义,赋值语句相当于将函数体定义语句赋值给一个变量,相当于函数名;所以匿名函数对应赋值的变量需要像函数一样带()进行调用 5 print(cal(3)) 6 #函数在内存中存储方式:函数体对应的内存地址可以用函数名寻址到,内存中可以认为是一堆函数体的字符串,函数名()代表执行函数名对应内存中的代码。 7 #函数即变量,函数调用时其内部语句被定义即可,不需要函数定义时其内部调用的函数在此函数之前;即不要求test2定义在test1之前,只是先将两个函数体存储到内存,test1()调用时才具体执行对应语句 8 def test1(): 9 print("this is test1") 10 test2() 11 def test2(): 12 print("this is test2") 13 test1() 14 15 #高阶函数:函数内部调用另外一个函数,包括返回值返回另外一个函数内存地址即函数名不带() 16 def High_Level_Fun(): 17 test1() 18 return test2 19 20 #嵌套函数:函数内部使用def定义一个类似局部变量的函数 21 def nest(): 22 def nested(): 23 print("this is nested") 24 25 #被装饰函数无形参的装饰器展开:一个统计函数执行时间的装饰器 26 def Fun1(): #定义一个被装饰函数 27 time.sleep(3) 28 print("this is Func1") 29 30 #装饰器展开写法 31 #装饰器实现1:定义一个新函数,将装饰功能函数作为嵌套函数定义在此函数内,并使用高阶函数将装饰功能函数地址进行返回 32 def timer(func): 33 def deco(): #定义一个计算Deco形参对应函数执行时间的函数 34 start_time = time.time() 35 func() 36 stop_time = time.time() 37 print("%s run time is %s"%(func,stop_time - start_time)) 38 return deco #将deco函数定义语句的内存地址返回 39 #装饰器实现2:调用装饰器实现1中定义的timer将被装饰函数作为实参传入,并将其返回值赋值给需要被装饰的函数,此例中被装饰函数为Fun1。 40 Fun1 = timer(Fun1) #此时内存中Fun1指向的内存中其函数定义已经不是Fun1最开始的数据了,此时是deco的内容; 41 #装饰器实现3:直接调用Fun1即直接调用deco;被装饰函数原来的定义内容在运行新的Fun1时候是能够找到并且被执行的,这个价断点调试就能看到效果 42 Fun1() 43 44 #装饰器实际使用时省略补助2和3,在被装饰函数前@装饰函数的函数名 45 @timer 46 def Func2(): 47 time.sleep(3) 48 print("this is Func2") 49 Func2()
python基础 装饰器 被装饰函数不带形参原理详解
猜你喜欢
转载自www.cnblogs.com/flags-blog/p/11920840.html
今日推荐
周排行