装饰器
装饰器作用就是为已定义的函数添加功能,并不修改原有函数的代码,高阶函数和闭包结合使用就可以形成装饰器。简单举例说明:
#-*- coding:utf-8 -*- #假如我们有多个函数需要执行,但是执行前需要手工确认 import sys def 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 sys def 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 sys def 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 ) |