装饰器

装饰器

【解释】
装饰器实质是一个函数,它把一个函数作为为已经输入并且返回另外一个函数,在装饰器中通常使用下面的技巧:
*args 和**kwargs
闭包
作为参数的函数
下面定义一个装饰器document_it,实现如下功能:
打印输出函数的名字和参数的值;
执行含有参数的函数;
打印输出结果;
返回修改的函数

>>> def document_it(func):
...     def new_function(*args,**kwargs):
...             print('runing function:',func.__name__)
...             print('positional arguments:',args)
...             print('keyword arguments:',kwargs)
...             result=func(*args,**kwargs)
...             print('result:',result)
...             return result
...     return new_function

直接在要装饰的函数前添加装饰器的名字

>>> @document_it
... def add_ints(a,b):
...     return a+b
... 
>>> add_ints(1,2)
('runing function:', 'add_ints')
('positional arguments:', (1, 2))
('keyword arguments:', {})
('result:', 3)
3

同样一个函数可以有多个装饰器,下面写一个对结果求平方的装饰器square_it()

>>> def square_it(func):
...     def new_functions(*args,**kwargs):
...             result=func(*args,**kwargs)
...             return result*result
...     return new_functions
... 

靠近函数定义(def 上面的)装饰器最先执行,然后依次执行上面的,任何顺序都会得到相同的最终结果,下面的例子会看到中间步骤的变化

>>> @document_it
... @square_it
... def add_ints(a,b):
...     return a+b
... 
>>> add_ints(2,3)
('runing function:', 'new_functions')
('positional arguments:', (2, 3))
('keyword arguments:', {})
('result:', 25)
25

交换两个装饰器的顺序

>>> @square_it
... @document_it
... def add_ints(a,b):
...     return a+b
... 
>>> add_ints(3,5)
('runing function:', 'add_ints')
('positional arguments:', (3, 5))
('keyword arguments:', {})
('result:', 8)
64
posted @ 2016-07-25 18:07  夏日花开  阅读(90)  评论(0编辑  收藏  举报