python装饰器简单理解

装饰器定义:1、把一个函数名当作实参传给另外一个函数(在不修改装饰函数源代码的情况下为其添加功能)  

      2、返回值中包含函数名(不改变函数调用方式)

源代码:

1 def f():
2     def f():
3     time.sleep(2)
4     print('i am f') 
5     

加基本计算程序运行时间函数

1 def f():
2     print('i am f')
3     time.sleep(2)
4 def my_time():
5             s_time = time.time()
6             f()
7             e_time = time.time()
8             print("消耗了%s秒"%(e_time - s_time))
9 my_time()
 1 #把func函数传入
 2 def f():
 3     print('i am f')
 4     time.sleep(2)
 5 def my_time(func): #传入函数
 6             s_time = time.time()
 7             f()    #打印函数
 8             e_time = time.time()
 9             print("%s消耗了%s秒"%(func.__name__,e_time - s_time))
10 my_time(f)  #

但调用时需用my_time来调用,思路就是可以把my_time下的定义为一个函数,再把它返回

 1 def f():
 2     print('i am f')
 3     time.sleep(2)
 4 def my_time(func): #传入函数 my_timer(f) func = f
 5     def wrapper():
 6             s_time = time.time()
 7             f()    #打印函数
 8             e_time = time.time()
 9             print("%s消耗了%s秒"%(func.__name__,e_time - s_time))
10     return  wrapper #返回这个函数的内存地址
11 n = my_time(f) #相当于执行my_time函数,该函数返回指向了wrapper,相当于执行了wrapper(),而wrapper就开始执行时间啊,打印这些
12 f = n
13 f()

理解上述的return wrapper:返回的是func的内存,即 f函数的内存地址

print(my_time(f)) 输出的是wrapper的内存地址 表示return返回的地址

@my_time #等价于f = my_time(f)

加要求,多打一个log,且要在时间函数前

猜你喜欢

转载自www.cnblogs.com/ilovelh/p/10250168.html