简言之,python装饰器就是用于拓展原来函数功能的一种函数,这个函数的特殊之处在于它的返回值也是一个函数,使用python装饰器的好处就是在不用更改原函数的代码前提下给函数增加新的功能。
参考文章:https://www.cnblogs.com/Eva-J/p/4977823.html
def login(usr):
if usr == 'Eva_J':
print("loging ...")
return True
def wrapper(funcname):#funcname是函数地址,不是函数,return funcname只是返回函数地址,不是运行
if login('Eva_J'):
return funcname
def home1():
print 'this is the home page'
#home=wrapper(home1)#home是函数地址
#home() #运行home,即在不改变home函数内容的前提下,对home增加额外功能
#点睛之笔"home = wrapper(home)"
#如果想去除 每次操作都加上的点睛之笔,可以按下面的方式定义home
@wrapper #在home1定义时,前面加上@wrapper,wrapper按需要改成自己的函数名
def home1():
print 'this is the home page'
#调用的时 可以直接这样调用
#home1()
#home传参数
def wrapper1(funcname):
print 'funcname:',funcname# funcname 是home函数的地址
def wrapper2(argv):#此处是函数嵌套定义,只是定义并不能运行
if login(argv):#调用login
print 'funcname:',funcname
return funcname(argv)#login调用成功后,调用home
else:
return False
return wrapper2 #返回wrapper2函数的地址
def home(usr):
print 'this is the home page!'
print 'hello ,',usr
#home = wrapper1(home)
#此时的home是wrapper2函数的地址
#home('Eva_J')#调用wrapper2 ,传入参数Eva_J
##精简调用
@wrapper1
def home(usr):
print 'this is the home page!'
print 'hello ,',usr
home('Eva_J')
#if __name__=='__main__':
#c = consumer()
#produce(c)
#即便不显示调用 home ,@wrapper1这个声明也是会调用wrapper1函数,先把函数地址传
#进去。然后该函数运行时,运行它自身和附加功能函数。