装饰器——应用

需求:检测程序运行时间(不能改变原函数的调用方式)

方法一:原程序下添加

  每个函数开头结尾都要多添加两行代码麻烦,冗余,增加工作量、添加删除不灵活

1 start=time.time()
2 print('程序运行')
3 print(time.time()-start)
View Code

 方法二:函数中添加

  引入time模块

  改变了原函数的调用方式,如果协调开发容易埋雷

 1 def tims(func):             #func参数赋值name
 2     start=time.time()
 3     func()                  #调用参数name()函数
 4     print(time.time()-start)
 5 
 6 def name():
 7     print('打印白瑞峰')
 8     time.sleep(1)
 9     print('打印结束')
10 tims(name)                  #调用tims()传入参数名name    

方法三:(装饰器应用)

 1 def tims(func):             #func参数赋值name
 2     start=time.time()
 3     func()                  #调用参数name()函数
 4     print(time.time()-start)
 5 
 6 def name():
 7     print('打印白瑞峰')
 8     time.sleep(1)
 9     print('打印结束')
10 name=tims(name)                 #内存地址的改变
11 # 上面代码可以打印结果,但是会报错,因为函数tims没有返回值
12 name()
View Code
 1 def tims(func):                 #func参数赋值name
 2     def inner():                # 闭包函数
 3         start=time.time()
 4         func()                  #内部函数运用了外部函数的变量
 5         print(time.time()-start)
 6     return inner                #这里返回的是一个地址
 7 
 8 @tims                       #等同于name=tims(name)
 9 def name():                 #被装饰函数
10     print('打印白瑞峰')
11     time.sleep(1)
12     print('打印结束')
13 # name=tims(name)                 #内存地址的改变
14 name()          #现在调用的是inner函数

  装饰器作用:

   在不修改原函数机器调用方式的情况下对原函数的功能进行扩展

 

方法四:(装饰器的参数运用)

 

 1 import time,random
 2 def cal_time(func):
 3     def wrapper(*args,**kwargs):
 4         start=time.time()
 5         results=func(*args,**kwargs)
 6         print(time.time()-start)
 7         return results
 8     return wrapper
 9 @cal_time                           
10 def func_name(name):            #形参
11     time.sleep(0.1)
12     print(name)                 #打印参数
13 func_name(999)                  #入参

 

 

方法五:(装饰器的作用与取消)

 

 1 import time,random
 2 def outer(state):                           #控制函数
 3     def cal_time(func):                     #装饰器函数
 4         def wrapper(*args,**kwargs):        #闭包函数
 5             if state:                       #判断为真执行
 6                 start=time.time()           #调用之前做的事情
 7             results=func(*args,**kwargs)
 8             if  state:
 9                 print(time.time()-start)    #调用之后做的事情
10             return results
11         return wrapper
12     return cal_time
13 
14 @outer(True)                   #True and false 根据参数 执行,或者不执行
15 
16 def func_name(name):                    #被装饰函数(装饰函数紧跟着被装饰函数)
17     time.sleep(0.1)                     #等待时间模拟程序运行的
18     print(name)
19 func_name(999)

 

posted @ 2020-03-05 15:33  localhost;  阅读(162)  评论(0编辑  收藏  举报