news 2026/7/29 14:10:43

Python __wrapped__介绍(函数属性,用于指向被装饰前的原始函数)functools.wraps、函数签名检查inspect模块、多层装饰器链

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python __wrapped__介绍(函数属性,用于指向被装饰前的原始函数)functools.wraps、函数签名检查inspect模块、多层装饰器链

文章目录

  • 深入理解 Python 的 `__wrapped__` 属性
    • 一、什么是 `__wrapped__`?
    • 二、为什么需要 `__wrapped__`?
    • 三、`functools.wraps` 的作用
    • 四、`__wrapped__` 的核心用途
      • 1. 访问原始函数
      • 2. 支持函数签名检查(inspect)
      • 3. 多层装饰器链
      • 4. 调试和工具支持
    • 五、实现原理简析
    • 六、最佳实践
      • ✅ 总是使用 `functools.wraps`
      • ❗ 不要手动忽略 `__wrapped__`
    • 七、总结

深入理解 Python 的__wrapped__属性

在 Python 的装饰器(decorator)体系中,函数包装(wrapping)是一种非常常见的技术。然而,函数一旦被装饰,原始函数的元信息(如名称、文档字符串、签名等)往往会被覆盖。为了解决这个问题,Python 引入了一个非常关键但容易被忽视的属性:__wrapped__

本文将系统介绍__wrapped__的作用、原理以及实际应用场景。


一、什么是__wrapped__

__wrapped__是一个函数属性,用于指向被装饰前的原始函数。

简单来说:

wrapped_function.__wrapped__==original_function

这个属性通常由标准库中的functools.wraps自动设置。


二、为什么需要__wrapped__

考虑一个最简单的装饰器:

defmy_decorator(func):defwrapper(*args,**kwargs):print("Before call")returnfunc(*args,**kwargs)returnwrapper

使用它:

@my_decoratordefadd(a,b):returna+b

此时:

print(add.__name__)# 输出: wrapper

问题出现了:原函数add的信息丢失了。


三、functools.wraps的作用

为了解决这个问题,我们通常这样写:

fromfunctoolsimportwrapsdefmy_decorator(func):@wraps(func)defwrapper(*args,**kwargs):print("Before call")returnfunc(*args,**kwargs)returnwrapper

@wraps(func)做了几件关键的事情:

  1. 复制元信息(如__name__,__doc__
  2. 设置__wrapped__属性

等价于:

wrapper.__wrapped__=func

四、__wrapped__的核心用途

1. 访问原始函数

print(add.__wrapped__)# <function add at ...>

甚至可以直接调用原始函数:

result=add.__wrapped__(2,3)print(result)# 5(跳过装饰器)

2. 支持函数签名检查(inspect)

Python 的inspect模块会使用__wrapped__来获取真实函数签名:

importinspectprint(inspect.signature(add))

如果没有__wrapped__,签名会变成:

(*args, **kwargs)

而不是:

(a, b)

3. 多层装饰器链

当有多个装饰器时:

@decorator1@decorator2deffunc():pass

会形成链式结构:

func->wrapper1->wrapper2->original

可以通过不断访问:

func.__wrapped__.__wrapped__

逐层回溯到最初的函数。


4. 调试和工具支持

很多工具(如:

  • 调试器
  • 文档生成工具
  • 类型检查工具

)都会依赖__wrapped__来“还原”真实函数。


五、实现原理简析

functools.wraps本质上是一个装饰器工厂:

defwraps(wrapped):defdecorator(wrapper):wrapper.__wrapped__=wrappedreturnwrapperreturndecorator

实际实现中还会复制:

  • __module__
  • __name__
  • __qualname__
  • __doc__
  • __annotations__

六、最佳实践

✅ 总是使用functools.wraps

fromfunctoolsimportwraps

这是推荐的标准写法,否则:

  • 调试困难
  • introspection 失效
  • 工具链支持变差

❗ 不要手动忽略__wrapped__

如果你写自定义装饰器但不设置__wrapped__,可能导致:

  • inspect失效
  • FastAPI / Click 等框架行为异常

七、总结

__wrapped__虽然是一个小属性,但在 Python 生态中扮演着关键角色:

  • 保留函数原始引用
  • 支持 introspection(自省)
  • 让工具链正常工作
  • 提升调试体验

一句话总结:

__wrapped__是装饰器世界中的“回溯指针”。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/14 14:47:28

Qwen2-VL-2B-Instruct企业级应用:基于Vue.js构建智能内容审核管理后台

Qwen2-VL-2B-Instruct企业级应用&#xff1a;基于Vue.js构建智能内容审核管理后台 1. 引言&#xff1a;当内容审核遇上智能助手 想象一下&#xff0c;你运营着一个用户活跃的社区平台&#xff0c;每天有成千上万的用户上传图片、发布评论。人工审核团队需要24小时盯着屏幕&am…

作者头像 李华
网站建设 2026/7/14 14:47:14

互联网+医院分级诊疗大数据云平台解决方案:分级诊疗系统、互联网医院平台、移动医生站与护士站、患者端应用、运营管理端、大数据中心

本方案构建省-市-县-基层四级联动的互联网分级诊疗平台&#xff0c;通过移动医生站、患者端APP及大数据中心&#xff0c;实现医疗信息互联互通、转诊协同、服务下沉&#xff0c;提升基层诊疗能力与运营效率&#xff0c;重塑合理就医体系。 400余份医疗医院大健康资料合集&…

作者头像 李华
网站建设 2026/7/14 14:47:13

【统计检验】方差齐性检验

统计检验前置必做&#xff1a;方差齐性检验&#xff5c;原理方法Python实战全攻略 方差齐性检验是进行 t 检验、方差分析&#xff08;ANOVA&#xff09;、线性回归 之前必须做的前提检验&#xff0c;用来判断“不同组数据的波动大小是否差不多”。一、什么是方差齐性&#xff1…

作者头像 李华
网站建设 2026/7/14 14:47:26

临床试验中重复测量数据的多重填补:SAS实现与应用

1. 临床试验中的重复测量数据缺失问题 在药物临床试验中&#xff0c;重复测量数据是最常见的数据类型之一。想象一下&#xff0c;我们需要定期测量患者的血压、血糖或其他关键指标&#xff0c;这些数据通常会按照预定的时间点&#xff08;比如基线期、治疗第7天、第14天等&…

作者头像 李华