码迷,mamicode.com
首页 > 其他好文 > 详细

闭包 装饰器

时间:2019-10-06 19:02:23      阅读:91      评论:0      收藏:0      [点我收藏+]

标签:完成   str   pytho   私有   function   执行方法   面向对象   class   his   

闭包

概念:内部函数对外部函数作用域里变量的引用

  • 例子

      def fun():#外部函数
          a = 1#外部函数作用域里的变量
          print(‘this is func‘)
          def func1(num):#内部函数也就是闭包函数
              print(‘this is func1‘)
              print(num + a)      
          return func1
    
      var = fun()  #此时的 var = func1
      var(3)
      #结果
      this is func
      this is func1
      4

闭包存在的意义:

1.闭包内的闭包函数私有化了变量
2.完成了数据的封装,类似于面向对象

  • 再来看个例子

      mylist = [1,2,3,4,5]
    
      def func(obj):
          print(‘func:‘,obj)
          def func1():
              obj[0] += 1
              print(‘func1:‘,obj)
          return func1
    
      var = func(mylist)
      var()
      var()
      var()
    
      #结果:
      func:[1,2,3,4,5]
      func1:[2,2,3,4,5]
      func1:[3,2,3,4,5]
      func1:[4,2,3,4,5]

装饰器(也叫做语法糖)

概念:外部函数传入被装饰函数名,内部函数返回装饰函数名。不影响原有函数的功能,还能够添加新的功能。

  • 例子

      def fun1(func):      #外部闭包函数的参数是被装饰的函数对象
          def fun2():
              print(‘aaabbb‘)
              return func()#返回的是外部函数接收的被装饰函数的调用,也就是返回函数的调用
          return fun2      #这个是返回函数对象
    
      @fun1
      def myprint():        #myprint传入func
          print(‘我是myprint‘)
    
      myprint()
      #结果
      aaabbb
      我是myprint
  • 过程解析

1.调用myprint ---> 识别到语法糖。

2.将myprint传入func --->也就是 fun1(myprint)() //后面这个括号是语法糖的效果

3.由于遇到return fun2 所以fun1(myprint)()就是 fun2()

4.执行fun2()方法,打印‘aaabbb‘,返回func()

5.前面说过,myprint当做参数传递过去给func,所以func() = myprint()

6.所以执行方法myprint(),打印‘我是myprint‘

闭包 装饰器

标签:完成   str   pytho   私有   function   执行方法   面向对象   class   his   

原文地址:https://www.cnblogs.com/fan-1994716/p/11628006.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!