1 闭包就是一个嵌套定义的函数,在外层运行时才开始内层函数的定义,然后将内部函数的引用传递函数外的对象,内部函数和使用的外部函数提供的变量构成的整体称为闭包。
def closure():
print('外函数')
def fun_inner():
print('内函数')
return fun_inner
fun = closure()
fun()
外函数
内函数
2 函数名只是函数代码空间的引用,当函数名赋值给一个对象的时候 就是引用传递,所以上述代码也可`
def closure():
print('外函数')
def fun_inner():
print('内函数')
return fun_inner
fun = closure()
closure()()
外函数
内函数
3 装饰器的基础是闭包,思想是 1封闭:已实现的功能代码块
2 开放:对扩展开发
def decorator(fun):
def fun_inner():
fun()
return fun_inner
@decorator
def func():
print('func函数')
func()
func函数
4 装饰器传参
def decorator(fun):
def fun_inner(a,b):
print(a,b)
fun()
return fun_inner
@decorator
def func():
print('func函数')
func(1,2)
1 2
func函数
装饰器不定长参数
def decorator(fun):
def fun_inner(a,*args):
print(a,args)
fun()
return fun_inner
@decorator
def func():
print('func函数')
func(1,2,3,4,4,5,)
1 (2, 3, 4, 4, 5)
func函数
装饰器传参问题
def decorator_out(num):
def decorator(fun):
def fun_inner(a,b):
print(num)
print(a,b)
fun()
return fun_inner
return decorator
@decorator_out(2)
def func():
print('func函数')
func(1,2)
2
1 2
func函数
5 多个装饰器装饰一个函数
def fun1(fun):
print('外fun1函数')
def fun1_inner():
print('内fun1函数')
fun()
return fun1_inner
def fun2(fun):
print('外fun2函数')
def fun2_inner():
print('内fun2函数')
fun()
return fun2_inner
@fun2
@fun1
def fun():
print('fun函数')
fun()
外fun1函数
外fun2函数
内fun2函数
内fun1函数
fun函数
1 分析此函数执行,@fun1先执行,此时 fun=fun1(fun)
输出 : 外fun1函数
fun的地址内容为
def fun1_inner():
print(‘内fun1函数’)
fun() # == print(‘fun函数’)
2 此时 @fun2 发现上方已为函数,fun=fun2(fun)
输出 : 外fun2函数
fun的地址内容为:
def fun2_inner():
print(‘内fun2函数’)
print(‘内fun1函数’)
print(‘fun函数’)
3 再执行fun()
外fun2函数
内fun2函数
内fun1函数
fun函数