标签:
需求:有两个函数,home()以及tv()给不同的业务部门调用,但是由于之前设计的缺陷,现在需要在登录之前做登录的验证,但是要求不能对原有的函数进行修改,而只能进行扩展。实现步骤如下:
注意:tv返回为函数地址,tv()为函数返回值,没有定义return的话返回值为None
def login(func):
print ("welcome to login")
return func
def home(name):
print ("welcome %s to home page"%name)
def tv(name):
print ("welcome [%s] to tv page" %name)
tv = login(tv)
tv("Alex")
结果:
welcome to login
welcome [Alex] to tv page
结论:1.先定义一个login函数,形参为函数的地址,返回值也为函数地址。
=======================================================
def login(func):
def inner(arg):
print ("welcome to login")
func(arg)
return inner
def home(name):
print ("welcome %s to home page"%name)
@login
def tv(name):
print ("welcome [%s] to tv page" %name)
#tv = login(tv)
# print(type(tv))
tv("Alex")
结果:
welcome to login
welcome [Alex] to tv page
结论:这里的@login等同于tv = login(tv)。执行@login,返回inner的地址(tv = inner的地址),执行tv(‘Alex‘)相当于开始执行inner(‘Alex‘)函数,同时执行func(‘Alex‘),此时的func = tv的地址。
标签:
原文地址:http://www.cnblogs.com/python-study/p/5464010.html