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

为何Python自定义Exception中动态包装的__str__方法未按预期生效?

问题原因解析

核心原因是Python 对于内置类型的特殊魔术方法(如__str__、__repr__等)的查找逻辑是直接从类层面触发,不会读取实例上绑定的同名属性,你在__init__里给实例绑定self.__str__的操作不会被print()调用时触发。

详细说明

  • 当执行print(实例)时,解释器会直接查找该实例所属类的__str__方法,不会去实例的属性字典里检索是否有__str__绑定属性,所以你在实例上包装的__str__根本不会被调用,实际生效的还是Exception基类默认的__str__方法,只会输出你传入的error msg。
  • 若要实现预期效果,直接在类层面重写__str__方法即可,不需要在实例初始化阶段动态绑定:
class CustomException(Exception):
    """ABC"""
    def __str__(self):
        return self.__doc__ + '\n' + super().__str__()

print(CustomException('error msg'))
# 输出符合预期:
# ABC
# error msg
  • 补充说明:只有普通方法调用才会遵循「先查实例属性、再查类属性」的规则,魔术方法属于解释器特殊处理的调用逻辑,不适用普通属性查找规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 12:15:04