码迷,mamicode.com
首页 > 编程语言 > 详细

Python 装饰器

时间:2016-05-06 07:05:59      阅读:191      评论:0      收藏:0      [点我收藏+]

标签:

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

 

Python 装饰器

标签:

原文地址:http://www.cnblogs.com/python-study/p/5464010.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!