zoukankan      html  css  js  c++  java
  • 装饰器

    1.闭包特性

    #在outer函数内定义的x变量,在outer执行完之后,任然可以访问x,这种现象就是闭包的特性
    def outer():
        x = 1
        def inner():
            print(x)
        return inner
    
    f = outer()  #闭包函数inner()被加载到内存中,而不会被执行
    f()       #执行inner()
    

     2.装饰器

      装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等应用场景。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。

    3.一张图说明装饰器的用法

      

       foo=show_time(foo)其实是把wrapper引用的对象引用给了foo,而wrapper里的变量func之所以可以用,就是因为wrapper是一个闭包函数

      @show_time帮我们做的事情就是当我们执行业务逻辑foo()时,执行的代码由粉框部分转到蓝框部分

      装饰器在Python使用如此方便都要归因于Python的函数能像普通的对象一样能作为参数传递给其他函数,可以被赋值给其他变量,可以作为返回值

     4.带参数的被装饰函数

     1 import time
     2 
     3 def show_time(func):
     4 
     5     def wrapper(*args,**kwargs):
     6         start_time=time.time()
     7         func(*args,**kwargs)
     8         end_time=time.time()
     9         print('spend %s'%(end_time-start_time))
    10 
    11     return wrapper
    12 
    13 @show_time   #add=show_time(add)
    14 def add(*args,**kwargs):
    15 
    16     time.sleep(1)
    17     sum=0
    18     for i in args:
    19         sum+=i
    20     print(sum)
    21 
    22 add(2,4,8,9)

     5.带参数的装饰器

      通过在装饰器函数外层再封装一层函数,并且该函数的返回值是装饰器函数 

     1 import time
     2  
     3 def time_logger(flag=0):
     4  
     5     def show_time(func):
     6  
     7             def wrapper(*args,**kwargs):
     8                 start_time=time.time()
     9                 func(*args,**kwargs)
    10                 end_time=time.time()
    11                 print('spend %s'%(end_time-start_time))
    12  
    13                 if flag:
    14                     pass
    15  
    16             return wrapper
    17  
    18     return show_time
    19  
    20 @time_logger(1)
    21 def add(*args,**kwargs):
    22     time.sleep(1)
    23     sum=0
    24     for i in args:
    25         sum+=i
    26     print(sum)

      

  • 相关阅读:
    JS中所有数组的方法和所有的对象方法,包含ES5和ES6
    (原创!)彻底理解JS中的事件,事件处理函数,钩子函数,回调函数。
    深拷贝和浅拷贝的区别,object.assgin方法是深拷贝还是浅拷贝
    axios,Ajax,jQuery ajax,axios和fetch的区别
    python : 文档比较
    leetcode——989.数组形式的整数加法
    leetcode——66.加一
    leetcode——283.移动0
    leetcode——27.移除元素
    leetcode刷题第一天——两数之和
  • 原文地址:https://www.cnblogs.com/dongmengze/p/9480622.html
Copyright © 2011-2022 走看看