装饰器
装饰器作用就是为已定义的函数添加功能,并不修改原有函数的代码,高阶函数和闭包结合使用就可以形成装饰器。简单举例说明:
#-*- coding:utf-8 -*-#假如我们有多个函数需要执行,但是执行前需要手工确认import sysdef my_print(): print ("this is a test!") def confirm(f): def inner(): my_confirm=input("是否继续yes/no:") if my_confirm == 'yes': f() else: sys.exit() return inner my_print=confirm(my_print)my_print() |
python支持一种友好的写法,可以省去再次定义原来的函数:
#-*- coding:utf-8 -*-import sysdef confirm(f): def inner(): my_confirm=input("是否继续yes/no:") if my_confirm == 'yes': f() else: sys.exit() return inner @confirm #在需要调用判断功能的函数前加@def my_print(): print ("this is a test!") my_print() |
如果被装饰的功能函数有参数,在装饰器内部也要添加对应的参数,简单举例说明:
#-*- coding:utf-8 -*-#装饰器之功能函数加参数import sys def confirm(f): def inner(*x,**y): my_confirm=input("是否继续yes/no:") if my_confirm == 'yes': f(*x,**y) #注意f和inner的参数要一一对应 else: sys.exit() return inner @confirm def my_sum(*a,**b): result=0 for i in a: result+=i print(result) my_sum(1,2,3,4,5) |
如果再为装饰器添加一个功能,并且装饰器可以传参,只需要在原有装饰器外部再添加一层嵌套函数,简单举例说明:
#-*- coding:utf-8 -*-import sysdef judge(default=0): def confirm(f): def inner(*x,**y): my_confirm=input("是否继续yes/no:") if my_confirm == 'yes': print(f(*x,**y)) if f(*x,**y) > int(default): print('more') else: print('less') else: sys.exit() return inner return confirm @judge(10)def my_sum(*a,**b): result=0 for i in a: result+=i return(result) my_sum(1,2,3,4,5) |
随时随地看视频