zoukankan      html  css  js  c++  java
  • Python 闭包和装饰器

    闭包

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

    • 例子

        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'

    • 再来看个例子

        def fun1(func):
        	def fun2(x,y):
        		print(x,y)
        		x += 3
        		y += 3
        		return func(x,y)
        	return fun2
      
      
        @fun1
        def mysum(a,b): #a = a + 5  b同理
        	print(a+b)
      
        mysum(1,1)
        #结果
        1 1
        8
      

    被装饰的函数带参数,只需要在最内部函数传入参数即可。

  • 相关阅读:
    input type="number"
    Creating Directives that Communicate
    angular Creating a Directive that Adds Event Listeners
    angular 自定义指令 link
    cookie
    angular filter
    angular 倒计时
    angular $watch
    angular 自定义指令
    angular 依赖注入
  • 原文地址:https://www.cnblogs.com/jiajiaba/p/10659544.html
Copyright © 2011-2022 走看看