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
相关产品推荐
相关产品推荐

