python 是一门应用极为广泛的编程语言。当一个函数被装饰器封装后,其 __name__ 属性通常会被覆盖为装饰器内部 wrapper 函数的名称,从而导致在调试、日志追踪或反射操作中产生歧义。为了解决这一常见问题,python 标准库提供了 functools.wraps 工具,它能自动将原始函数的关键元数据(如 __name__、__doc__、__module__ 等)复制到包装函数上。本文将详细演示如何在自定义装饰器中正确集成 @functools.wraps,以保障函数标识的准确性,增强代码的可读性与可维护性。
1、 启动 PyCharm,并加载你的 Python 工程项目。

2、 在项目结构中新建一个 Python 源文件,例如命名为 test.py,并使用内置编辑器打开该文件。
3、 在文件中使用 def 语句声明一个名为 log 的装饰器工厂函数,该函数接受一个字符串参数 text,用于指定日志内容。
立即学习“Python免费学习笔记(深入)”;

4、 在 log 装饰器内嵌套的 wrapper 函数定义之前,添加装饰器语句:@functools.wraps(func)。此举确保被装饰的目标函数所有关键属性均被完整继承,防止元信息丢失。

图片提示词生成器?不止如此。 马甲系统 —— 把脑海中的画面,翻译成AI能理解的专业表达。 用得越多,它越懂你:首次需要多问几句确认方向,用久了几乎一说就懂。 用得越多,它越快:缓存机制让后续对话越来越省。 RAG进化:成功案例持续入库,越跑越聪明。 输入「新手指南」查看完整功能介绍
5、 使用 def 创建一个普通函数,命名为 now。
6、 在 now 函数定义上方添加 @log("execute"),表示对该函数应用 log 装饰器,并传入执行日志标记。

7、 添加一行调用语句:print(now.__name__),用于验证装饰后函数的名称是否仍保持为 "now"。

8、 在编辑区域右键单击,从上下文菜单中选择“Run 'test'”来运行当前脚本。
9、 查看终端输出结果:可见 now.__name__ 正确显示为 "now",说明 functools.wraps 成功保留了原始函数的身份特征,未被装饰器逻辑干扰。


















