学习python的装饰器,按照看的教程自己操作一遍
#coding=utf-8 def auth(func): def inner(*args,**kw): print 'first run %s!'%func.__name__ funcs = func(*args, **kw) print 'after run %s!'%func.__name__ return funcs return inner @auth def f1( *args,**kw): print 'run f1 %s' %(args) @auth def f2( *args,**kw): #print 'run f1 %s' %(args) return args f1(['sfa','saffsa']) print f2(['f2']) #带参数的装饰器,原理 两层调用 def auth_param(param): def outter(func): def inner(*args,**kwargs): print 'first run %s brefore %s!'%(func.__name__,param) funcs = func(*args, **kwargs) print 'after run %s brefore %s!'%(func.__name__,param) return funcs return inner return outter @auth def f3(*args,**kwargs): out = 'run f3 with %s'%args return out @auth_param('decorate_params') def f4(*args,**kwargs): out = 'run f4 with %s'%args return out print f3('f3') print f4('f4') #多层装饰器,一层一层执行 @auth @auth_param('decorate_params') def f5(*args,**kwargs): out = 'run f5 with %s'%args return out print f5('f5') #看看更拽的装饰器 def before(request,kargs): print 'brfore' def after(request,kargs): print 'after' def deco_fun(before_func, after_func): def outer(func): def inner(request, kargs): before_resut = before_func(request,kargs) if before_resut !=None: return before_resut main_result = func(request,kargs) after_result = after_func(request,kargs) if after_result!=None: return after_result return main_result return inner return outer @deco_fun(before, after) def f6(request, kargs): return request print f6('f6','haha')
下面是输出结果
/System/Library/Frameworks/Python.framework/Versions/2.6/bin/python2.6 "/Applications/PyCharm CE.app/Contents/helpers/pydev/pydevd.py" --multiproc --qt-support --client 127.0.0.1 --port 59076 --file /Users/liuchangke/study-software/zhihuSpider/decorate_test.py
pydev debugger: process 3610 is connecting
Connected to pydev debugger (build 143.1919)
first run f1!
run f1 ['sfa', 'saffsa']
after run f1!
first run f2!
after run f2!
(['f2'],)
first run f3!
after run f3!
run f3 with f3
first run f4 brefore decorate_params!
after run f4 brefore decorate_params!
run f4 with f4
first run inner!
first run f5 brefore decorate_params!
after run f5 brefore decorate_params!
after run inner!
run f5 with f5
brfore
after
f6
Process finished with exit code 0