08 闭包和装饰器


闭包和装饰器

  • 官方定义:内部函数作用域对外部函数作用域变量的引用,可以想象成一个生孩子的过程,在函数运行结束后留下一些东西(闭包)。

    #example1 一个完成的闭包
    def fun():
        a=1
        print('this is func')
        #闭包函数
        def func1(num):
            print('this is func1')
            #占用了a
            print(num+a)
        return func1
    #函数运行完已经被内存清除了(函数的生命周期)
    var=fun()
    var(3)
    
    #example2 
    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)
    #此时闭包里面有 obj[0]+=1 print('func1:',obj)
    
  • 装饰器:我们通过闭包来创建一个装饰器

    #这个func就是我们要接收的函数(需要装饰的函数)
    #我们设置一个装饰器,它的功能就是在原函数print之前先print一句话
    def func1(func):
        def func2():
            print('我是闭包')
            #这里传回的是原函数的执行
            return func()
        #这里将闭包传回
        return func2
    #语法糖
    @func1
    def func():
        print('这是一个普通的函数')
    
  • 装饰器函数带参数,把参数写在最外层,内层传递参数

    #最外层函数接收参数、内层函数接收被装饰函数
    def arg_func(sex):
        def func1(b_func):
            def func2():
                if sex=='男性':
                    print('你不可以生娃')
                else:
                    print('你可以生娃')
                return b_func()
            return func2
        return func1
    
    @arg_func('男性')
    def man():
        print('好好工作')
    
    @arg_func('女性')
    def woman():
        print('好好工作')
    
    man()
    woman()
    
  • 被装饰的函数带参数,参数写在内层即可

    def func1(func):
        def func2(x,y):
            print(x,y)
            x+=5
            y+=5
            return func(x,y)
        return func2
    
    @func1
    def mysum(a,b):
        print(a+b)
    #=13
    mysum(1,2)