@outer
def foo():
pass
装饰器
1.装饰器是一个函数,至少2层
2.执行outer函数,被装饰的函数作为参数outer(foo),outer函数的返回值,赋值给被装饰的函数的函数名
3.动态参数,可以装饰含有n个参数的函数
4.函数的返回值
5.多装饰器
6.3层装饰器
装饰不含参数的函数
@outer = outer(f1)
装饰含参数的函数
![](https://i-blog.csdnimg.cn/blog_migrate/7383d6d01aaba03bf7dc3e92e793e863.png)
装饰含多个参数的函数
通过 *args,**kwargs ,传入几个参数,函数就会自动判断
![](https://i-blog.csdnimg.cn/blog_migrate/4c47490de706448f0625f16f401b9ba5.png)
装饰含返回值的函数return
![](https://i-blog.csdnimg.cn/blog_migrate/3f3d6ce43876969ce3af4965dd0b9255.png)
多装饰器
#!/usr/bin/env python
#codencoding: utf-8
def outer1(func):
def wapper():
print '装饰器1'
func()
return wapper
def outer2(func):
def wapper():
print '装饰器2'
func()
return wapper
@outer2
@outer1
def foo():
print 'It is foo'
foo()
![](https://i-blog.csdnimg.cn/blog_migrate/73cc2b689de6591bf7008735086fe03e.png)
3层装饰器
@w2(arg)
1、执行w2函数,得到返回值,ret
2、创建装饰器,@+ ret : @ret
3、执行装饰器@ret
装饰器-动态参数-登陆验证
def login():
name = raw_input('please you name:')
pwd = raw_input('please you pwd:')
if name == 'admin' and pwd == '123456':
return True
else:
return False
def outer(func):
def wrapper():
is_login = login()
if not is_login:
return '登陆失败'
return func()
return wrapper
@outer
def f1():
print 'f1'
return '欢迎光临'
print f1()
def login(key): #验证用户名
local_key = 'fefwgwe2352525sdgdsgdsgsgs'
if local_key == key:
return True
else:
return False
def outer(func):
def wrapper(*args,**kwargs):
#key = kwargs['token'] #取出token对应值
#del kwargs['token'] #删除token键值,因为f1()只能传1个参数
key = kwargs.pop('token') #此句可代替上面2句功能
is_login = login(key)
if not is_login:
return '非法用户'
temp = func(*args,**kwargs)
return temp
return wrapper
@outer
def f1(arg):
print 'f1',arg
return '欢迎光临'
key = 'fefwgwe2352525sdgdsgdsgsgs'
print f1('yangmv',token=key)