标签:
1:装饰器是函数,只不过该函数可以具有特殊的含义,装饰器用来装饰函数或类,使用装饰器可以在函数执行前和执行后添加相应操作。
2:至少两层函数
def auth(func): def inner(): print ‘before‘ func() return inner def f1(): print ‘f1‘ ret = auth(f1) f1 = ret f1()
执行结果:
before
f1
执行过程:
# 1:执行def auth(func): # 2: def f1(): # 3: ret = auth(f1) 执行auth函数,将f1传值给func, # 因为没有执行inner函数,所以return直接返回,但是返回的是inner函数名,里面的func==传入的f1 # 4: 此时 ret = innet函数名 # 5:执行f1 = ret,将inner函数名赋值给f1 # 5:执行f1(),也就是执行inner函数,然后打印before,它里面的func函数,但是func==f1,所以执行f1函数,打印f1
def auth(func): def inner(): print ‘before‘ func() return inner @auth def f1(): print ‘f1‘ f1()
执行过程:
# 1:使用@auth来代替注释掉的两行。 # 2:执行@auth,将下面的函数名f1作为auth的参数 # 3:执行auth函数,被装饰的函数作为参数auth(foo),auth函数的返回值,赋值给被装饰的函数的函数名@auth
def auth(func): def inner(): print ‘before‘ func() print ‘after‘ return inner @auth def f1(): print ‘f1‘ f1() 结果: before f1 after
def auth(func): def inner(arg): print ‘验证‘ func(arg) print ‘日志‘ return inner @auth def f1(arg): print ‘f1‘,arg f1(‘带参数‘) 结果: 验证 f1 带参数 日志
def login(): name = ‘ccc‘ if name == ‘cgt‘: return True else: return False def auth(func): def inner(*args,**kwargs): is_login = login() if not is_login: return ‘invaild username‘ tmp = func(*args,**kwargs) print ‘登陆日志‘ return tmp return inner @auth def fetch_server_list(): print ‘server list‘ server_list = [1,2,3,4,5] return server_list ret = fetch_server_list() print ret 结果: 1:如果name = ccc 则输出 invaild username 2:如果name = cgt 则输出 server list 登陆日志 [1, 2, 3, 4, 5]
标签:
原文地址:http://www.cnblogs.com/caoxiaojian/p/4990008.html