装饰器

昨日回顾

函数嵌套

  在一个函数中定义另一个函数,嵌套定义

    默认情况下 只能在内部使用,内部函数可以访问外层函数中的内容

  在一个函数的函数体中调用了另一个函数,嵌套调用

 

名称空间

  存放名字与值的内存地址的绑定关系的内存区域

  三个名称空间

  内置的

    存的是内置的名称,随着解释器的运行而生效,随着解释器的关闭而失效

    内置的名字在任何位置都能访问到

  全局的

    存的是文件级别的,也就是顶着最左边,没有任何缩进的名称

  局部的

    存的是函数内部定义的名称,随着函数的运行而生效,随着函数的运行结束而失效

    特点:只能在当前函数内访问

  名称空间的查找顺序

    局部  -> 全局 ->内置

作用域

  分为全局和局部

    内置的和全局的名称空间被划分为全局作用域

    局部空间的名称处于局部作用域

 

    强调:名称空间与作用域的访问顺序在定义时就已经确认了,与调用位置无关

 

函数对象

  一切皆对象

  函数可以当做变量来使用,除了变量不能调用外,其他用法都相同

    1.函数可以调用

    2.函数可以当做容器类型的元素

    3.函数可以作为函数的参数

    4.函数可以作为函数的返回值

 

闭包函数

  什么是闭包函数

    它本质也是一个函数,与普通函数的不同之处在于

    闭包函数是一个被定义在另一个函数的内部的函数,可以直接访问到外层函数中的内容

 

    当我们将这个内部函数用return金星返回时,外界就可以拿到这个函数的地址

    同时,由于名称空间与作用域是定义时就固定了,无论你在什么位置调用这个内部函数

    它都能狗访问到外层的名称,这就体现了包的概念

    

    特点

      拿到这个函数时,不仅仅只有函数地址,还包裹着外层的名称空间的内容

------------------------------------------------------------------------------------------------------------------

 

装饰器

  什么是装饰器

    器,指的就是一种工具,例如生活中的打孔器

    装饰,指的是给某个已存在的对象添加装饰品

    

    装饰的目的:

      为了给被装饰的对象添加新功能或者说是增强某种能力

 

    在程序中工具就是函数

    如此一来,装饰器也就是一个函数,被装饰者也是一个函数

    总结:装饰器就是用一个函数去扩展另一个已存在的函数的功能

 

    扩展性是对于一个应用程序来说非诚重要的能力,任何应用程序都需要扩展,于是出现了开闭原则

 

开闭原则

  对修改关闭,对扩展开放

  不允许修改源代码以及调用方式

  装饰器就是一种可以保证不修改源代码,也不修改调用方式,还能给函数添加新功能的方式

  例如:      

         import time    

           def outer(func):        def run_time(*args,**kwargs): #是为了让装饰函数能接受任何形式任何长度的参数

            boot_time = time.time()
    res = func(*args,**kwargs) #将参数再原模原样交给被装饰着
    print("耗时:",time.time() - boot_time)
    return res #把原始函数的执行结果 再交给调用者
    return run_time()



装饰器的语法糖

 
  
语法糖
   
就是一种简便写法,使语法更简洁
    

 

      该语法就可以帮我完成对原始函数的伪装

      注意 

        1.必须卸载被装饰函数的正上方

        2.在开发时装饰器必须写在被装饰函数之上

    在嵌套多个装饰器时,执行的顺序是从上到下依次调用,结束的顺序反过来,是从下往上

    实际开发中 没什么用

      

  无参
  
def outer(func):
    def wrapper(*args,**kwargs):
    #新功能
      res = func(*args,**kwargs)
      return res
  return wrapper
  有参

    def Outer(arg):

      def outer(func):

        def wrapper(*args,**kwargs)

          #新功能

          res = func(*args,**kwargs)

          return res

      return wrapper

    return outer

 

posted @ 2019-01-15 13:16  -Rye-  阅读(104)  评论(0)    收藏  举报