一.从闭包说起
()python中闭包。
通俗的理解:函数里面包含另一个函数。里面函数用到了外面函数的数据。代码说明如下:
def func1(str):
def func2():
print("你好 %s"%str)
return func2
f = func1("小明")
f()
输出结果:你好小明
理解:str在func1中有效,即在fun2中也生效。func1返回func2的引用。这样就在func2中用到了fun1的数据。
(2)当你在fun1中定义局部变量,同里在func2中也同样生效,不过需要用nonlocal声明。
def func1(str):
a = 1
def func2():
nonlocal a
a = a+1
print("你好 %d"%a)
return func2
f = func1("小明")
f()
二.装饰器
装饰器:外部函数传入被装饰函数名,内部函数返回装饰函数名。
特点:1.不修改被装饰函数的调用方式 2.不修改被装饰函数的源代码。就可以增加原有函数的功能。
(1)无参数的装饰器。
def set_func(func):
print("----开始装饰-----")
def call_func(*args,**kwargs):#这里写成多值参数是为了增加装饰器的通用性
print("--这是验证1")
print("--这是验证2")
return func(*args,**kwargs) #拆包
return call_func
@set_func#test1 = set_func(test1)
def test1(num,*args,**kwargs):
print("-----test1----%d" % num)
print("-----test1----", args)
print("-----test1----", kwargs)
return "ok","200"
@set_func
def test2():
pass
ret = test1(100)
print(ret)
装饰器的执行流程:
装饰器相当于执行了test1 = set_func(test1),让func指向了原来test的内存区域,然后让test1指向了闭包区域。这样就实现了不用改变原来函数的调用方法,利用闭包扩展了函数的功能。
def arg_func(name):
def set_func(func):
def call_func(*agrs, **kwagrs):
print ("这是装饰器传进来的参数%s"%name)
return func(*agrs, **kwagrs)
return call_func
return set_func
@arg_func('demo1')
def demo1():
print ("这是demo1")
@arg_func('demo2')
def demo2():
print ("这是demo2")
demo1()
demo2()
执行结果:
这是装饰器传进来的参数demo1
这是demo1
这是装饰器传进来的参数demo2
这是demo2
#再一次利用闭包里面函数可以访问外面函数的参数的原来,给里面的装饰器带一个参数,这样就实现了带参数的装饰器。