装饰器的初识

Posted wyh0717

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了装饰器的初识相关的知识,希望对你有一定的参考价值。

装饰器的初识

    • 版本一: 大壮 写一些代码测试一下index函数的执行效率。
    import time
    # def index():
    #     ‘‘‘有很多代码.....‘‘‘
    #     time.sleep(2) # 模拟的网络延迟或者代码效率
    #     print(‘欢迎登录博客园首页‘)
    #
    # def dariy():
    #     ‘‘‘有很多代码.....‘‘‘
    #     time.sleep(3) # 模拟的网络延迟或者代码效率
    #     print(‘欢迎登录日记页面‘)
    
    # 版本一有问题: 如果测试别人的代码,必须重新赋值粘贴。
    # start_time = time.time()
    # index()
    # end_time = time.time()
    # print(end_time-start_time)
    #
    # start_time = time.time()
    # dariy()
    # end_time = time.time()
    # print(end_time-start_time)
    
    
    
    • 版本二:利用函数,解决代码重复使用的问题

      import time
      def index():
          ‘‘‘有很多代码.....‘‘‘
          time.sleep(2) # 模拟的网络延迟或者代码效率
          print(‘欢迎登录博客园首页‘)
      # index()
      def dariy():
          ‘‘‘有很多代码.....‘‘‘
          time.sleep(3) # 模拟的网络延迟或者代码效率
          print(‘欢迎登录日记页面‘)
      
      def timmer(f):  # f= index
          start_time = time.time()
          f()  # index()
          end_time = time.time()
          print(f‘测试本函数的执行效率{end_time-start_time}‘)
      timmer(index)
      
      版本二还是有问题: 原来index函数源码没有变化,给原函数添加了一个新的功能测试原函数的执行效率的功能。
      满足开放封闭原则么?原函数的调用方式改变了。
      
      
      
    • 版本三:不能改变原函数的调用方式。

      # import time
      # def index():
      #     ‘‘‘有很多代码.....‘‘‘
      #     time.sleep(2) # 模拟的网络延迟或者代码效率
      #     print(‘欢迎登录博客园首页‘)
      #
      # def timmer(f):  # f = index  (funciton index123)
      #     def inner():  # inner :(funciton inner123)
      #         start_time = time.time()
      #         f()  # index() (funciton index123)
      #         end_time = time.time()
      #         print(f‘测试本函数的执行效率{end_time-start_time}‘)
      #     return inner  # (funciton inner123)
      # timmer(index)  # index()
      # ret = timmer(index)  # inner
      # ret()  # inner()
      
      # index = timmer(index)  # inner (funciton inner123)
      # index()  # inner()
      
      
      
    • 版本四:具体研究

      import time
      def index():
          ‘‘‘有很多代码.....‘‘‘
          time.sleep(2) # 模拟的网络延迟或者代码效率
          print(‘欢迎登录博客园首页‘)
      
      def timmer(f):
          f = index
          # f = <function index at 0x0000023BA3E8A268>
          def inner():
              start_time = time.time()
              f()
              end_time = time.time()
              print(f‘测试本函数的执行效率{end_time-start_time}‘)
          return inner
      
      index = timmer(index)
      index()
      
    • 版本五:python做了一个优化;提出了一个语法糖的概念。 标准版的装饰器

      import time
      # timmer装饰器
      def timmer(f):
          def inner():
              start_time = time.time()
              f()
              end_time = time.time()
              print(f‘测试本函数的执行效率{end_time-start_time}‘)
          return inner
      
      # @timmer # index = timmer(index)
      def index():
          ‘‘‘有很多代码.....‘‘‘
          time.sleep(0.6) # 模拟的网络延迟或者代码效率
          print(‘欢迎登录博客园首页‘)
          return 666
      ret = index()
      print(ret)
      
      def dariy():
          ‘‘‘有很多代码.....‘‘‘
          time.sleep(3) # 模拟的网络延迟或者代码效率
          print(‘欢迎登录日记页面‘)
      dariy()
      # index = timmer(index)
      # index()
      # dariy = timmer(dariy)  @timmer
      dariy()
      
      
      
    • 版本六:被装饰函数带返回值

      import time
      # timmer装饰器
      def timmer(f):
          # f = index
          def inner():
              start_time = time.time()
              # print(f‘这是个f():{f()}!!!‘) # index()
              r = f()
              end_time = time.time()
              print(f‘测试本函数的执行效率{end_time-start_time}‘)
              return r
          return inner
      
      @timmer # index = timmer(index)
      def index():
          ‘‘‘有很多代码.....‘‘‘
          time.sleep(0.6) # 模拟的网络延迟或者代码效率
          print(‘欢迎登录博客园首页‘)
          return 666
      # 加上装饰器不应该改变原函数的返回值,所以666 应该返回给我下面的ret,
      # 但是下面的这个ret实际接收的是inner函数的返回值,而666返回给的是装饰器里面的
      # f() 也就是 r,我们现在要解决的问题就是将r给inner的返回值。
      ret = index()  # inner()
      print(ret)
      
      
    • 版本七:被装饰函数带参数

      import time
      # timmer装饰器
      def timmer(f):
          # f = index
          def inner(*args,**kwargs):
              #  函数的定义:* 聚合  args = (‘李舒淇‘,18)
              start_time = time.time()
              # print(f‘这是个f():{f()}!!!‘) # index()
              r = f(*args,**kwargs)
              # 函数的执行:* 打散:f(*args) --> f(*(‘舒淇‘,18))  --> f(‘舒淇‘,18)
              end_time = time.time()
              print(f‘测试本函数的执行效率{end_time-start_time}‘)
              return r
          return inner
      
      @timmer # index = timmer(index)
      def index(name):
          ‘‘‘有很多代码.....‘‘‘
          time.sleep(0.6) # 模拟的网络延迟或者代码效率
          print(f‘欢迎{name}登录博客园首页‘)
          return 666
      index(‘纳钦‘)  # inner(‘纳钦‘)
      
      @timmer
      def dariy(name,age):
          ‘‘‘有很多代码.....‘‘‘
          time.sleep(0.5) # 模拟的网络延迟或者代码效率
          print(f‘欢迎{age}岁{name}登录日记页面‘)
      dariy(‘舒淇‘,18)  # inner(‘舒淇‘,18)
      
      

      标准版的装饰器

      标准版的装饰器;
      
      def wrapper(f):
          def inner(*args,**kwargs):
              ‘‘‘添加额外的功能:执行被装饰函数之前的操作‘‘‘
              ret = f(*args,**kwargs)
              ‘‘‘‘添加额外的功能:执行被装饰函数之后的操作‘‘‘
              return ret
          return inner
      
      

以上是关于装饰器的初识的主要内容,如果未能解决你的问题,请参考以下文章

Python 基础第十一天(闭包和装饰器初识)

装饰器初识

python全栈闯关--11-装饰器初识

python基础四:装饰器

Python进阶装饰器(Decorator)

函数章节详解