python基础 装饰器 被装饰函数不带形参原理详解

 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()

猜你喜欢

转载自www.cnblogs.com/flags-blog/p/11920840.html
今日推荐