@outer
def foo():
pass
装饰器
1.装饰器是一个函数,至少2层
2.执行outer函数,被装饰的函数作为参数outer(foo),outer函数的返回值,赋值给被装饰的函数的函数名
3.动态参数,可以装饰含有n个参数的函数
4.函数的返回值
5.多装饰器
6.3层装饰器
装饰不含参数的函数
@outer = outer(f1)
装饰含参数的函数
装饰含多个参数的函数
通过 *args,**kwargs ,传入几个参数,函数就会自动判断
装饰含返回值的函数return
多装饰器
#!/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()
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)