码迷,mamicode.com
首页 > 其他好文 > 详细

二十六、装饰器(decorator)

时间:2020-07-12 00:39:41      阅读:62      评论:0      收藏:0      [点我收藏+]

标签:item   number   简洁   效果   日志   loaded   block   变量作用域   ret   

装饰器

  • 变量作用域

    • 局部作用域

    • 全局作用域

  • 高阶函数

    • 函数名可以作为参数输入

    • 函数名可以作为返回值

  • 闭包

    • 示例代码

      def outer():
         x = 10
         def inner():
             print(x)
         return inner
    • 定义

      如果在一个内部函数里,对在外部作用域(不在大全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)

    • 说明

      inner是一个内部函数,inner里引用了外部作用域的变量x(x在外部作用域outer里面,但是不是全局作用域),则这个内部函数inner就是一个闭包

  • 装饰器

    • 示例代码

      import time 
      ?
      ?
      # 实现装饰器类
      def show_time(func):
         def inner(*args, **kwargs):
             start = time.time()
             func(*args,**kwargs)
             end = time.time()
             return end-start
         return inner
      ?
      # 系统写法,简洁优雅
      @show_time
      def add_num(a, b):
         return a+b
      ?
      ?
      # 自定义写法,繁琐不简洁
      def add_num(a,b):
         return a+b
      add_num_run_time = show_time(add_num)
      add_num_run_time()
    • 示例效果

      技术图片

    • 作用

      添加额外的功能

    • 装饰器参数

      • 通过外嵌一个函数实现

      • 示例代码

        import time 
        ?
        def logger(flags=False):
           # 实现装饰器类
           def show_time(func):
               def inner(*args, **kwargs):
                   start = time.time()
                   func(*args,**kwargs)
                   end = time.time()
                   if flags:
                       print("启动记录日志的功能")
                   return end-start
               return inner
           return show_time
        ?
        # 系统写法,简洁优雅
        @logger(True)
        def add_num(a, b):
           return a+b
      • 示例效果

         技术图片

二十六、装饰器(decorator)

标签:item   number   简洁   效果   日志   loaded   block   变量作用域   ret   

原文地址:https://www.cnblogs.com/nuochengze/p/13286140.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!