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

