Python—闭包与装饰器

将之前学习Python的笔记整理记录下来。
闭包
概念:
  一种组织代码的结构,减少了参数传递,提高了代码的可重复使用性
  如果在一个内嵌函数里,对在外部函数内的变量进行引用,那么内嵌函数就被认为闭包。
缺点:
  由于闭包引用了外部函数的局部变量,则外部函数的局部变量没有及时释放,消耗内存。
前提:
  1.必须有一个内嵌函数
  2.内嵌函数必须引用外部函数的变量
  3.外部函数的返回值必须是内部函数对象
举例:
  def func(a, b):
      def func_in(x):
         return a * x + b
      # 返回内部函数
      return func_in

  if __name__ == '__main__':
      ts = func(1, 1)
      # 传递参数
      print(ts(2))
装饰器
概念:
  1.装饰器其实是用闭包来实现的。
  2.本质上是一个python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。
  3.装饰器不能对被装饰的函数内部进行操作 只能在函数执行之前或者后面添加功能。
应用场景:
  参数检查(Agrument checking)
  缓存(Caching)
  代理(Proxy)
  提供上下文(Context Provider)
装饰器执行/装饰顺序:
  装饰由下到上 执行由上到下
举例:
  def add_fun(func3):
    # 定义不定长参数 接收
    def fun_in(*args, **kwargs):
        print("---add----")
        # 无论有没有返回值 都接受
        ret = func3(*args, **kwargs)
        return ret
    return fun_in

  # 装饰有参数的函数
  @add_fun
  def func(fun):
      print("fun ", fun)

  # 装饰有返回值的函数
  @add_fun
  def func1():
      return "func1"

  if __name__ == '__main__':
      func(123)
      ret = func1()
      print(ret)
闭包和装饰器区别:
  装饰器需要传递被装饰的函数对象给装饰器
  闭包则需要传递变量给内嵌函数
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • # 本次讲述的知识点也是非常重要的(严肃脸) # 先有的闭包,之后才生成了装饰器,同样的也是非常简单的东西。 # ...
    米兰的小铁匠阅读 473评论 0 4
  • python万物皆对象! 闭包 闭包:两个函数的嵌套,外部函数返回内部函数的引用,外部函数一定有参数 def 外部...
    风舞柏杨阅读 813评论 2 0
  • 闭包 1.函数引用 运行结果: 2.什么是闭包 运行结果: 3.重讲闭包 内部函数对外部函数作用域里变量的引用(非...
    墨痕hz阅读 1,550评论 0 4
  • 运行结果如下: 闭包的定义:在函数内部再定义一个函数,并且这个函数用到了外边函数的变量,那么将这个函数以及用到的一...
    魔法高校的劣等生阅读 530评论 0 0
  • 免费代理❤️❤️ 拿货价合理❗️❗️你赚我也赚❗️❗️ 免费代理我会给你一个价格表的,价格表上的价格就是你的拿货价...
    鱼哈哈ovo阅读 390评论 0 0