python学习 装饰器

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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值