装饰器
【解释】
装饰器实质是一个函数,它把一个函数作为为已经输入并且返回另外一个函数,在装饰器中通常使用下面的技巧:
*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