赞
踩
def w1(func):
def inner():
print('---正在验证---')
func() #闭包
return inner
def f1():
print ('-----f1-----')
def f2():
print ('-----f2-----')
f1 = w1(f1) #调用的 f1 发生改变
f1()
#在没有修改 f1 引用的前提下,完成对 f1 的扩展
运行结果:
在很多情况下,我们想在程序原基础上增加一些功能,但又不能直接修改代码,可以通过装饰器,完成对函数的扩展。
修改代码如下:
def w1(func):
print('---正在装饰---')
def inner():
print('---正在验证---')
func()
return inner
@w1 #只要python执行到这个代码,就会自动装饰,不需要等待调用
def f1():
print ('-----f1-----')
#实际上,在调用f1之前,已经完成了装饰器的调用
f1()
运行结果:
【补充】
1.有参数函数的修饰
我们在上面讨论的装饰器是不含参数的,当我们需要装饰传递参数的函数时,就需要在装饰器内的函数上动手。
程序如下:
def func(functionName):
print ('-----func----1-')
def func_in(a,b): #【这里传参数】如果没有定义a,b 会导致调用test(10,12)失败
print ('-----func_in-1-')
functionName(a,b) #【这里传参数】 如果没有传递a,b 会导致调用def test(a,b)失败
print ('-----func_in-2-')
print ('-----func---2-')
return func_in
@func
def test(a,b):
print ('-----test-a=%d,b=%d---'%(a,b))
test(10,12)
运行结果如下:
**当传递不定长的参数时,将闭包中的a,b改为 *args,**kwargs 即可
程序:
def func(functionName):
print ('-----func----1-')
def func_in(*args,**kwargs):
print ('-----func_in-1-')
functionName(*args,*kwargs)
print ('-----func_in-2-')
print ('-----func---2-')
return func_in
@func
def test(a,b,c,d):
print ('-----test-a=%d,b=%d,c=%d,d=%d---'%(a,b,c,d))
test(10,12,24,55)
结果:
我们可以发现,在面对需要传递参数的函数,我们在修饰函数时,只要在闭包的函数和引用的函数上传递参数就可以。
2.有返回值的函数的修饰
程序如下:
def func(functionName): print ('-----func----1-') def func_in(): print ('----func_in-1-') ret = functionName() #保存 返回的haha print ('-----func_in-2-') return ret #把haha返回到 ret=test()处的调用 print ('-----func----2-') return func_in @func def test(): print ('-----test-----') return 'haha' ret = test() print ('test return value is %s'%ret)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。