需求:有两个函数,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的地址。

 

posted on 2016-05-06 02:02  Alex0425  阅读(180)  评论(0编辑  收藏  举报