python学习笔记29:闭包基本概念

1 什么是闭包

创建闭包的方法:

  1. 定义一个外函数outer();
  2. outer()中定义一个临时变量;
  3. outer()中定义一个内函数inner();
  4. inner()中使用了outer中的临时变量;
  5. outer()的返回值是对inner的引用;
    这样就创建了一个闭包, 闭包的特性见第3节.

2 闭包实例

def outer():               #1. 定义一个外函数outer()
    _list_tmp = list()     #2. outer()中定义一个临时变量
    def inner(s_new_ele):  #3. outer()中定义一个内函数inner();
        _list_tmp.append(s_new_ele) #4. inner()中使用了outer中的临时变量;
        print(_list_tmp)
        return _list_tmp
    return inner           #5. outer()的返回值是对inner的引用;

if __name__ == '__main__':
    outer_0 = outer()  # outer_0中绑定了一个临时变量_list_tmp
    outer_0('a')       # 返回['a']
    outer_0('b')       # 返回['a', 'b']

    outer_1 = outer()  # outer_1中绑定了另一个临时变量_list_tmp, 与outer_0中的相互独立
    outer_1('x')       # 返回['x']
    outer_1('y')       # 返回['x', 'y']

    outer_0('c')       # 返回['a', 'b', 'c']
    outer_1('z')       # 返回['x', 'y', 'z']

3 闭包的特点

  1. 从外部读取函数内部的变量.
  2. 将创建的变量始终保持在内存中.
  3. 封装对象的私有属性和私有方法.

一般情况下, 一个函数运行结束时, 函数内部的临时变量就销毁了.
但闭包比较特殊, outer()运行结束后, 由于它的临时变量用在inner()中, 所以这个临时变量就绑定给inner()了.
并且, 多次运行outer()函数返回的多inner中的临时变量是相互独立的.

4 闭包的应用

  1. 装饰器.
  2. 面向对象, 由于临时变量在inner之间是相互独立的, 与class有相同的特点, 所以可以使用闭包来实现class(python的class不是用闭包实现的).
  3. 实现单例模式.
原文地址:https://www.cnblogs.com/gaiqingfeng/p/14006965.html