当前位置:   article > 正文

python学习 装饰器_python tk 装饰器

python tk 装饰器
def w1(func):
	def inner():
    	print('---正在验证---')
   	    func()    #闭包
return  inner
def f1():
	print ('-----f1-----')
def f2():
	print ('-----f2-----')
	
f1 = w1(f1)  #调用的 f1 发生改变
f1()
#在没有修改 f1 引用的前提下,完成对 f1 的扩展
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

运行结果:
在这里插入图片描述
在很多情况下,我们想在程序原基础上增加一些功能,但又不能直接修改代码,可以通过装饰器,完成对函数的扩展。

修改代码如下:

def w1(func):
	 print('---正在装饰---')
	 def inner():
   		 print('---正在验证---')
    	 func()
return  inner

@w1  #只要python执行到这个代码,就会自动装饰,不需要等待调用
def f1():
	print ('-----f1-----')
#实际上,在调用f1之前,已经完成了装饰器的调用
f1()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

运行结果:
在这里插入图片描述

【补充】
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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

运行结果如下:
在这里插入图片描述

**当传递不定长的参数时,将闭包中的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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

结果:
在这里插入图片描述
我们可以发现,在面对需要传递参数的函数,我们在修饰函数时,只要在闭包的函数和引用的函数上传递参数就可以。
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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/213307
推荐阅读
相关标签
  

闽ICP备14008679号