-
?为什么要使用装饰器
- 在软件开发的过程中,我们发现经常用到重复的代码,这就大大的增加了开发的周期,为了使得开发更为高效,python中主要特性之一就是装饰器。(
修改/生成/包装经常使用的代码
)
- 在软件开发的过程中,我们发现经常用到重复的代码,这就大大的增加了开发的周期,为了使得开发更为高效,python中主要特性之一就是装饰器。(
-
?如何自己编写一个装饰器函数
- 有时候,我们会遇到这样的问题,事先已经写好某些函数,但是想要在这些函数的基础上添加一些额外的功能(
登录验证/记录日志/生成时间戳
) - 定义一个装饰器函数:
- 有时候,我们会遇到这样的问题,事先已经写好某些函数,但是想要在这些函数的基础上添加一些额外的功能(
>>> import time
>>> from functools import wraps
>>>
>>>
>>> def timeabout(func):
'''定义一个装饰器用来生成执行某函数需要的时间戳'''
@wraps(func)
def wrapper(self, *args, **kwargs):
s = time.time() #开始时间
result = func(self, *args, **kwargs) #func指的未被装饰的原始函数
e = time.time() #结束时间
print(func.__name__,e - s) #打印两部分内容(被装饰的函数名,需要的时间戳)
return result
return wrapper
- 使用此装饰器
>>>@timeabout #使用此装饰器对下列阶乘函数进行包装处理
def factorial(n):
if n == 1:
return 1
else:
return factorial(n-1)*n
>>>
>>> factorial(10)
factorial 0.0
factorial 0.05403733253479004 #经过装饰器处理的阶乘函数
factorial 0.06404519081115723
factorial 0.07304859161376953
factorial 0.08205389976501465
factorial 0.0930624008178711
factorial 0.10106801986694336
factorial 0.10907340049743652
factorial 0.11607766151428223
factorial 0.12308287620544434
3628800 #阶乘函数的结果
>>>
- 装饰器即函数,可以接受函数作为输入,并且返回一个新的函数作为输出。
#方法一和方法二执行后效果一样
#方法一
@timeabout
def factorial(n):
if n == 1:
return 1
else:
return factorial(n-1)*n
#方法二
```python
def factorial(n):
if n == 1:
return 1
else:
return factorial(n-1)*n
factorial = timeabout(factorial)
- 装饰器内部创建了一个新的函数(如
wrapper
),*args, **kwargs
用来接收任何形式的输入参数。如需了解python中的函数如何使用,请浏览本作者关于函数的文章。
- 在此函数
wrapper
内部,需要调用原来的函数(需要装饰的函数
),将其作为参数输入,并返回结果。 - 可以添加额外的代码,实现其它的方法。
- 新的函数(如
wrapper
)会作为此装饰器的结果返回,取代原来的函数。