装饰器:本身是一个函数,用于装饰其他函数。

作用:增强被装饰函数的功能。

装饰器通常把其他函数作为参数,增加其功能。

例1:函数不需被调用,直接运行 

>>> def deco(func): ######定义装饰器函数,func函数为参数

...     print('before myfunc() called')

...     func()  #######调用原函数,也就是被装饰的函数

...     print('after myfunc() called ')

... 

>>> @deco      ######用@标识装饰器

... def myfunc():  #########myfunc()将作为函数传入deco函数,被装饰函数

...     a = 1

...     b = 2

...     print(a+b)

... 

before myfunc() called

3

after myfunc() called 

例2:用内套函数,不让函数直接运行

>>> def deco(func):   ######定义函数,func函数为参数

...     def _deco():   ######定义内置函数,若每次函数,装饰器执行结束,程序运行

...         print('before myfunc() called')

...         func()   #######调用原函数,也就是被装饰的函数

...         print('after myfunc() called ')

...     return _deco   ######调用_deco函数,

... 

>>> @deco        ########定义装饰器

... def myfunc():  ########被装饰函数

...     print('myfunc() called')

...     return 'ok'

... 

>>> myfunc()   ################调用函数,被装饰后功能加强

before myfunc() called

myfunc() called

after myfunc() called 

>>> myfunc()   ############可以多次调用

before myfunc() called

myfunc() called

after myfunc() called 

例3:被装饰的函数带参数

>>> def deco(func):         ########func只能是被装饰函数,无论带不带参数,都这么写

...     def _deco(a,b):    ###########此函数参数,为被装饰参数的传值

...         print('before myfunc() called')

...         ret = func(a,b)       #############调用被装饰函数,参数来之_deco(a,b)

...         print('after myfunc() called()')

...         return ret

...     return _deco   #########调用_deco函数

... 

>>> @deco 

... def myfunc(a,b):      #######被装饰函数带参数

...     print('myfunc(%s,%s) called' %(a,b))

...     return a+b

... 

>>> myfunc(1,2)    #########调用被装饰参数

before myfunc() called

myfunc(1,2) called   

after myfunc() called()

3

函数运行说明:

myfunc()函数被调用,此时将作为参数传入deco函数,deco函数嵌套_deco函数,在解析到return _deco时,调用_deco(a,b)函数,输出before myfunc() called,调用func(a,b)函数,输出函数内容myfunc(1,2) called, 并将返回值赋给ret,之后输出after myfunc() called(),输出ret,程序运行结束。

参考;

http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html