ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

三大器之-----装饰器

2019-07-23 22:56:51  阅读:304  来源: 互联网

标签:func1 time1 time2 time print 装饰 def 大器


装饰器

  1. 开放封闭原则
    • 对拓展是开放的,允许代码拓展,添加新功能
    • 对修改是封闭的,不能修改函数的源码和调用方式
  2. 装饰器
    • 在不改变原被装饰函数的源代码以及调用方式前提下,为其添加额外功能

      # 版本一,测试每个函数都要写一遍代码
      import time
      def func1():
          time.sleep(2)    # 暂停2秒
          print('测试延迟')
      time1 = time.time()   # 返回的格林威治时间,是此时此刻距离1970年1月1日0时0分0秒的时间秒数,也叫时间戳
      func1()
      time2 = time.time()
      print(time2-time1)
      # 版本二 只能测试特定的函数
      import time
      def func1():
          time.sleep(2)
          print('测试延迟')
      def ceshi():
          time1 = time.time()
          func1()
          time2 = time.time()
          print(time2-time1)
      ceshi()
      # 版本三,虽然没有改变原函数的代码,但是改变了执行方式,不符合开放封闭原则
      import time
      def func1():
          time.sleep(2)
          print('测试延迟')
      def ceshi(func):
          time1 = time.time()
          func()
          time2 = time.time()
          print(time2-time1)
      ceshi(func1)
      #版本四,实施真正的开放封闭原则:装饰器
      import time
      def func1():
          time.sleep(2)
          print('测试延迟')
      def timer(func):
          def ceshi():
              time1 = time.time()
              func()
              time2 = time.time()
              print(time2-time1)
          return ceshi
      func1 = timer(func1)
      func1()
      #带返回值的装饰器
      import time
      def func1():
          time.sleep(2)
          print('测试延迟')
          return '测试成功'
      def timer(func):
          def ceshi():
              time1 = time.time()
              ret = func()
              time2 = time.time()
              print(time2-time1)
              return ret
          return ceshi
      func1 = timer(func1)
      print(func1())
      # 被装饰函数带参数的装饰器
      import time
      def func1(name):
          time1 = time.sleep(2)
          print(f'{name}测试延迟')
          return f'{name}测试成功'
      def timer(func):
          def ceshi(name):
              time1 = time.time()
              ret = func(name)
              time2 = time.time()
              print(time2-time1)
              return ret
          return ceshi
      func1=timer(func1)
      print(func1('太上老君'))
      # 被装饰函数不定参数的装饰器
      import time
      def func1(*args,**kwargs):
          time.sleep(2)
          print(f'{args}测试延迟')
          return f'{args,kwargs}测试成功'
      def timer(func):
          def ceshi(*args,**kwargs):
              time1 = time.time()
              ret = func(*args,**kwargs)
              time2 = time.time()
              print(time2-time1)
              return ret
          return ceshi
      func1 = timer(func1)
      print(func1('太上老君','元始天尊',我叫='通天教主'))
      #标准装饰器:语法糖
      import time
      def timer(func):   #func=func1
          def ceshi(*args,**kwargs):
              # args = ('太上老君', '元始天尊')
              # kwagrs = {'我叫'; '通天教主'}
              time1 = time.time()
              ret = func(*args,**kwargs)   
              time2 = time.time()
              print(time2-time1)
              return ret
          return ceshi
      @timer    # 相当于 func1 = timer(func1),没有特殊意义,为了简化
      def func1(*args,**kwargs):
          time.sleep(2)
          print(f'{args,kwargs}测试延迟')
          return f'{args,kwargs}测试成功'
      print(func1('太上老君', '元始天尊', 我叫='通天教主'))

标签:func1,time1,time2,time,print,装饰,def,大器
来源: https://www.cnblogs.com/douzi-m/p/11234965.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有