Python装饰器是修改或增强函数行为的工具,其本质是一个可调用对象,接收被装饰函数作为参数,并返回一个新函数。
理解装饰器关键在于认识到它只是语法糖,写法@decorator等价于func = decorator(func),这一等价关系揭示了装饰器的核心运作机制。
装饰器内部通常定义嵌套函数,嵌套函数内调用原函数,并可添加额外操作,最后返回嵌套函数,从而实现对原函数的包装。
看一个计时装饰器实例:import time
def timer(func):
def wrapper(args, **kwargs):
start = time.time()
result = func(args, **kwargs)
print(f‘耗时{time.time()-start:.4f}秒’)
return result
return wrapper
使用时只需在目标函数上方写@timer,每次调用该函数便会自动打印执行耗时,而不改动函数内部代码。
装饰器支持带参数,这需要再增加一层函数嵌套,外层接收参数,中层接收函数,内层处理调用,形成三层结构。
多个装饰器叠加时,执行顺序从下往上,即靠近函数的装饰器先执行,靠近声明的后执行,这符合数学中的复合函数顺序。
functools模块中的wraps装饰器非常重要,它能将原函数的元信息(如名字、文档字符串)复制到包装函数中,避免调试时产生困惑。
装饰器广泛应用于日志记录、权限校验、缓存结果、重试逻辑等场景,是Python程序员实现面向切面编程的利器。
掌握装饰器不仅提升代码复用性,还能深入理解Python的函数模型和闭包特性,是进阶Python开发的必经之路。