装饰器
装饰器作用就是为已定义的函数添加功能,并不修改原有函数的代码,高阶函数和闭包结合使用就可以形成装饰器。简单举例说明:
#-*- 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)
转载于:https://blog.51cto.com/fengjicheng/2105107