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

Python 3.7中Exception子类未显式调用父类构造器仍能接收参数的疑问

Python自定义异常类参数默认接收的底层逻辑
  • 普通自定义类的实例化流程中,__init__是实例创建完成后的初始化方法,父类的__init__确实不会隐式调用,你第一个示例的运行结果符合普通Python类的行为逻辑。
  • 而Exception属于Python内置的C实现类型,它的参数接收逻辑不依赖__init__方法:传入构造器的参数会在实例创建阶段的__new__方法中被自动捕获,存入实例内置的args元组属性,这个过程不需要__init__参与。
  • 异常被抛出后的默认打印逻辑,会直接读取异常实例的args属性内容拼接输出,所以哪怕你在子类的__init__中没有做任何参数处理,只要你调用构造器时传入了参数,它就会被__new__自动存入args,最后被打印出来。

你可以通过以下代码验证这个逻辑:

class E(Exception):
    def __init__(self, msg):
        # 完全不处理传入的msg
        pass

e = E("hello")
print(e.args) # 输出结果为 ('hello',)

如果要屏蔽这个默认行为,只需要在子类__init__中清空args属性即可:

class E(Exception):
    def __init__(self, msg):
        self.args = ()

raise E("hello")
# 此时输出仅为 __main__.E,不会附带hello内容

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 07:09:00