如何实现一个python函数装饰器(Decorator)
装饰器本质上是一个 Python 函数或类,它可以让其他函数或类在不需要做任何代码修改的前提下增加额外功能,装饰器的返回值也是一个函数/类对象。它经常用于为已有函数/类添加记录日志、计时统计、性能测试等。

首先定义一个倒计时函数,这个函数的功能非常简单,就是把n从当前值减少到0。
def countdown(n):
while n > 0:
print('time' + str(n))
n -= 1
print(countdown.__name__)
程序输出:
countdown
1.为函数增加一个日志装饰器
假设现在要增强countdown的功能,在函数调用前后自动打印日志,又不想修改函数自身的功能。这种在代码运行期间动态增加功能的方式,称之为装饰器(Decorator)。
能打印日志的decorator,可以定义如下:
def log(func):
def wrapper(*args, **kw):
print('call %s().' % func.__name__)
return func(*args, **kw)
return wrapper
然后我们借助Python的@语法,把decorator置于函数的定义处:
@log
def countdown(n):
while n > 0:
print('time:' + str(n))
n -= 1
countdown(10)
程序输出:
call countdown().
time:10
time:9
time:8
time:7
time:6
time:5
time:4
time:3
time:2
time:1
但此时我们再打印函数的name:
print(countdown.__name__)
程序输出:
wrapper
我们发现函数的元数据信息变了,这显然不是我们想要的结果。
2. 在装饰器中拷贝元数据
为了把函数的元数据信息都保留下来,我们可以直接使用Python提供的functools库中的@wraps装饰器。
from functools import wraps
def log(func):
@wraps(func)
def wrapper(*args, **kw):
print('call %s().' % func.__name__)
return func(*args, **kw)
return wrapper
@log
def countdown(n):
while n > 0:
print('time:' + str(n))
n -= 1
print(countdown.__name__)
程序输出:
countdown
3.为函数增加一个计时装饰器
添加函数装饰器的方法已经讲清楚了,现在再实现一个完整的函数计时耗时装饰器。
import time
from functools import wraps
def TimeCost(func):
@wraps(func)
def wrapper(*arg, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print(func.__name__, end - start)
return result
return wrapper
@TimeCost
def countdown(n):
while n > 0:
print('time:' + str(n))
n -= 1
countdown(10000)
函数输出:
('countdown', 0.0004801750183105469)
参考资料:
https://www.liaoxuefeng.com/wiki/1016959663602400/1017451662295584
Python Cookbook中文版
以上就是如何实现一个python函数装饰器(Decorator)的详细内容,更多关于python函数装饰器的资料请关注其它相关文章!
代码知识SEO上一篇 : Golang操作excel的方法
下一篇 : 在Spring Boot中从类路径加载文件的示例
-
SEO外包最佳选择国内专业的白帽SEO机构,熟知搜索算法,各行业企业站优化策略!
SEO公司
-
可定制SEO优化套餐基于整站优化与品牌搜索展现,定制个性化营销推广方案!
SEO套餐
-
SEO入门教程多年积累SEO实战案例,从新手到专家,从入门到精通,海量的SEO学习资料!
SEO教程
-
SEO项目资源高质量SEO项目资源,稀缺性外链,优质文案代写,老域名提权,云主机相关配置折扣!
SEO资源
-
SEO快速建站快速搭建符合搜索引擎友好的企业网站,协助备案,域名选择,服务器配置等相关服务!
SEO建站
-
快速搜索引擎优化建议没有任何SEO机构,可以承诺搜索引擎排名的具体位置,如果有,那么请您多注意!专业的SEO机构,一般情况下只能确保目标关键词进入到首页或者前几页,如果您有相关问题,欢迎咨询!