闭包和装饰器

简介: 闭包和装饰器

闭包


函数基本概念

  1. 1.函数在程序中也被看成一个对象处理
  2. 2.函数名就是这个对象的引用
  3. 3.函数引用即可以进行赋值,也可以被当做另外一个函数的参数或返回值进行传递和返回

 

闭包

闭包就是一种函数内部另定了另外一个函数的形式,定义闭包要满足三个条件

  1. 1.一个函数中定义了一个另外一个函数
  2. 2.内函数里运用了外函数的临时变量
  3. 3.外函数的返回值是内函数的引用

 

闭包的作用

  1. 1.隐藏内部函数的实现细节
  2. 2.代码更加安全

 

nonlocal

  1. 1.在闭包中,如果内函数只是简单使用了外函数的变量,可以不做修饰
  2. 2.如果对外函数的变量引用做了修改,那么要使用nonlocal 进行声明

 

装饰器


   

装饰器的是语法糖的一种

使用类或闭包来实现装饰器

   

装饰器的功能

在已有函数功能基础上,为已有函数添加额外的功能

 

装饰的使用

@xxx

 

装饰器的原理

     如有定义如下:

            @wrapper

            def show():

                 pass

装饰器展开的原理为:

     show = wrapper(show)

 

万能装饰器

  1. 根据被装饰的函数定义类型不同,装饰器的闭包定义形式可以有四种不同的变形
  2. 为了使装饰器的闭包函数更加通用,利用可变参数和关键字参数实现通用装饰器

 

     

def setFunc(func):
            def wrapper(*args, **kwargs):   # 接收不同的参数
               print('wrapper context')
               return func(*args, *kwargs) # 再原样传回给被装饰的函数
        return wrapper
classTest(object):
            # 通过初始化方法,将要被装饰的函数传进来并记录下来
            def__init__(self, func):
               self.__func= func
            # 重写 __call__ 方法来实现装饰内容
            def__call__(self, *args, **kwargs):
               print('wrapper context')
               return self.__func(*args, **kwargs)

 

 

类装饰器

1.通过 __init__方法和 __call__方法,利用仿函数的特性实现类装饰器

 

classTest(object):
            # 通过初始化方法,将要被装饰的函数传进来并记录下来
            def__init__(self, func):
               self.__func= func
            # 重写 __call__ 方法来实现装饰内容
            def__call__(self, *args, **kwargs):
               print('wrapper context')
               return self.__func(*args, **kwargs)

2.被类实现的装饰器进行装饰后,被装饰的函数引用指向了装饰器类的对象。

执行函数时,实际是在时行对像的仿函数形式调用

 

多个装饰器装饰一个函数

  1. 1.一个装饰器可以装饰多个函数
  2. 2.一个函数也可以被多个装饰器进行装饰
  3. 3.在装饰器装饰函数时,装饰的过程是自下向上进行装饰的。

 

装饰器传参

  1. 1.装饰器在使用过程中,可能需要对装饰器进行传参
  2. 2.在定义可以传参的装饰器闭包时,需要定义三层函数
  3. 3.最外层函数用来接收装饰器的参数
  4. 4.中间层用来实现装饰器
  5. 5.最内层用来执行具体的装饰内容
  6. 6.无论有几层或者几个装饰器去装饰已有函数,最终函数都是引用装饰器的最内层的函数。
  7. 7.@xxx(xxx)  先执行传参xxx(xxx) ,实际就是执行函数调用,得到中间层函数, 与@组合后变成装饰器形式,再进行装饰
相关文章
装饰器:装饰器为主,闭包和高阶函数为辅
装饰器:装饰器为主,闭包和高阶函数为辅
|
3月前
|
移动开发
浅谈H5闭包
浅谈H5闭包
|
4月前
|
测试技术 Python
装饰器
【8月更文挑战第1天】
25 2
|
4月前
|
存储 自然语言处理 JavaScript
闭包
闭包
18 0
|
7月前
|
JavaScript
03_装饰器
03_装饰器
69 1
|
JavaScript 前端开发
对闭包的理解以及使用
对闭包的理解以及使用
56 1
|
存储 缓存 前端开发
详解 Reat 中的闭包问题
JavaScript 中的闭包一定是最可怕的特性之一。 即使是无所不知的 ChatGPT 也会告诉你这一点。 它也可能是最隐秘的语言概念之一。 每次编写任何 React 代码时,我们都会用到它,大多数时候我们甚至没有意识到。 但最终还是无法摆脱它们:如果我们想编写复杂且高性能的 React 应用程序,我们就必须了解闭包。
108 0
详解 Reat 中的闭包问题
|
JSON 数据格式
装饰器的实际应用
使用装饰器模式改造slf4j打印json格式日志
770 0
装饰器的实际应用
|
Python 容器
【globlal与nonlocal和闭包函数、装饰器、语法糖】
【globlal与nonlocal和闭包函数、装饰器、语法糖】
125 0
|
Web App开发 设计模式 前端开发
五、闭包
初学JavaScript时,我在闭包上,走了很多弯路。而这次重新回过头来对基础知识进行梳理,要讲清楚闭包,也是一个非常大的挑战。 闭包有多重要?如果你是初入前端的朋友,我没有办法直观的告诉你闭包在实际开发中的无处不在,但是我可以告诉你,前端面试,必问闭包。面试官们常常用对闭包的了解程度来判定面试者的基础水平,保守估计,10个前端面试者,至少5个都死在闭包上。
138 0
五、闭包

热门文章

最新文章