Python装饰器本质是接收函数并返回新函数的高阶函数,通过闭包包装原函数、保留元信息(如用@wraps),实现行为增强而不改原代码。

Python装饰器本质是“函数的函数”——它接收一个函数作为参数,返回一个新的函数(或可调用对象),在不修改原函数代码的前提下,动态增强其行为。核心不在语法糖 @decorator,而在“包装+替换”这一动作:把原函数包进新逻辑里,再让变量名指向这个增强后的可调用体。
写 @log_time 看似神秘,实际等价于:
def func(): ...<br>func = log_time(func)
也就是说,装饰器语句会在函数定义后立即执行,把 func 替换为 log_time(func) 的返回值。理解这点,就拆掉了第一层迷雾。
立即学习“Python免费学习笔记(深入)”;
一个典型装饰器长这样:
def timer(func):<br> def wrapper(*args, **kwargs):<br> start = time.time()<br> result = func(*args, **kwargs)<br> print(f"{func.__name__} took {time.time()-start:.2f}s")<br> return result<br> return wrapper这里三个要点必须清楚:
func),并保持对其的引用wrapper)保存原函数和增强逻辑,形成闭包当你看到 @retry(times=3),这不是直接装饰,而是“装饰器工厂”:
def retry(times=1):<br> def decorator(func):<br> def wrapper(*args, **kwargs):<br> for i in range(times):<br> try:<br> return func(*args, **kwargs)<br> except Exception:<br> if i == times - 1: raise<br> return wrapper<br> return decorator
调用顺序是:retry(times=3) → 返回 decorator → decorator(func) → 返回 wrapper。三层嵌套,各司其职。
直接装饰后,func.__name__ 变成 'wrapper',help(func) 显示的是 wrapper 的文档。解决方法很简单:
用 from functools import wraps,并在 wrapper 上加 @wraps(func):
@wraps(func)<br>def wrapper(*args, **kwargs): ...
它会自动复制 func.__name__、__doc__、__module__ 等属性到 wrapper 上,避免调试和反射时“找不到人”。
不复杂但容易忽略。抓住“传函数、返函数、包逻辑、留元信息”这十六个字,装饰器就从炫技变成了顺手工具。
以上就是Python装饰器如何理解_函数增强原理解析【指导】的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号