You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么inspect.signature()获取的object.__new__()方法签名不准确?

结论

inspect模块没有返回错误的方法签名,这个不一致现象是object.__new__作为CPython内置基类特殊方法的实现特性导致的。

原因说明
  • 首先,object.__new__是C层面实现的内置方法,它对外暴露的通用签名确实是(*args, **kwargs)。这个可变参数设计是为了适配Python类的继承逻辑:当子类没有重写__new__时,构造实例传入的任意参数会先透传到object.__new__,不会在参数匹配阶段直接拦截,后续参数会交给子类的__init__方法处理;如果子类重写了__new__,可变参数的签名也不会阻碍自定义参数的传递。
  • 你看到的运行时报错,是CPython加的一层运行时特殊校验逻辑:当你直接调用object.__new__,且待实例化的类既没有重写__new__,也没有重写__init__来接收额外参数时,解释器会判定传入的多余参数是无效输入,直接抛出TypeError做友好提示。
  • inspect模块读取内置方法签名时,只能拿到方法对外暴露的静态签名定义,无法识别C实现方法内部写死的分支动态校验逻辑,因此会出现签名看起来支持任意参数、但特定场景下传额外参数报错的现象。
验证示例

你可以通过重写类的__init__方法观察差异:

class A:
    def __init__(self, val):
        self.val = val

# 此时调用不会报错,因为A重写了__init__声明需要接收额外参数
obj = object.__new__(A, 1)

注意:实际开发中不建议直接调用object.__new__传递额外参数,这类参数不会被基类__new__处理,属于无效传参。

内容的提问来源于stack exchange,提问作者smwikipedia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 15:01:05