zoukankan      html  css  js  c++  java
  • 装饰器——应用

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

    方法一:原程序下添加

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

    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)
  • 相关阅读:
    swt 更新主UI线程
    java中 快捷键输入System.out.println();
    原型设计工具
    JAVA笔记
    转:java读取配置文件的几种方法
    Server Message Block
    安全标识符
    BitLocker:如何启用网络解锁
    imageX.exe
    组策略首选项
  • 原文地址:https://www.cnblogs.com/cwl-bj/p/12420537.html
Copyright © 2011-2022 走看看