IPython中按回车输出类对象时调用的内部方法及字符串获取
问题解答
IPython中输入类名回车得到的展示文本,不是调用类自身的魔法方法生成的,这也是修改类的__str__、__repr__不生效的核心原因:IPython的输出展示走的是自有的pretty格式化体系,不会直接使用Python原生的str()/repr()返回结果。
具体触发逻辑
当你在IPython交互环境输入表达式回车后:
- IPython先对输入的表达式求值得到目标对象
- 触发内置的显示钩子,优先调用
IPython.lib.pretty模块的格式化逻辑生成展示文本 - 对于类(也就是
type类型的对象),IPython内置了专门的渲染规则:直接拼接类的__module__属性和__qualname__属性,最终生成__main__.MyClass格式的简洁文本,完全绕过了类自身__repr__返回的<class '__main__.MyClass'>格式。
编程获取对应字符串的方法
直接调用IPython的pretty格式化函数即可,得到的结果和回车展示的内容完全一致:
from IPython.lib.pretty import pretty class MyClass: pass output_str = pretty(MyClass) print(output_str) # 输出: __main__.MyClass
补充说明
对应的内部渲染逻辑不属于MyClass类本身,是IPython全局注册的类型格式化回调,存放在IPython.lib.pretty._type_pprinters映射表中,针对type类型做了特殊渲染处理。除非你主动给IPython注册自定义的类格式化规则,否则类自身定义的任何实例方法、魔法方法都不会改变这个默认输出。
内容的提问来源于stack exchange,提问作者James Lin
相关产品推荐
相关产品推荐

