闭包和装饰器
-
官方定义:内部函数作用域对外部函数作用域变量的引用,可以想象成一个生孩子的过程,在函数运行结束后留下一些东西(闭包)。
#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)