如何修改导入的不可变类型类的__repr__方法?
解决方案:自定义mpfr对象的显示格式(无需全量包装)
方法1:修改全局显示钩子(针对交互式环境/默认打印)
如果只是想在解释器或默认显示场景下简化mpfr的输出,可以重写sys.displayhook,对mpfr对象及包含它的容器做格式化处理:
import sys import gmpy2 original_hook = sys.displayhook def custom_display(obj): if isinstance(obj, gmpy2.mpfr): print(f"{obj:.10g}") elif isinstance(obj, (list, tuple, set)): formatted = [f"{x:.10g}" if isinstance(x, gmpy2.mpfr) else x for x in obj] print(formatted) else: original_hook(obj) sys.displayhook = custom_display
该方法仅影响解释器的默认输出(如直接输入变量名回车的显示),主动调用print()时需结合其他方案。
方法2:为自定义类重写显示方法
针对内部包含mpfr对象的自定义类,直接在类中实现__repr__或__str__,格式化内部mpfr属性即可:
import gmpy2 class HighPrecisionData: def __init__(self, raw_value): self.precise_val = gmpy2.mpfr(raw_value, precision=512) def __repr__(self): return f"HighPrecisionData(precise_val={self.precise_val:.10g})" # 使用示例 data = HighPrecisionData("2.71828182845904523536028747135266249775724709369995") print(data) # 输出: HighPrecisionData(precise_val=2.718281828)
这是最直接的定制方式,完全不影响mpfr的原有功能。
方法3:轻量包装器(针对独立mpfr对象的显示)
如果需要批量处理mpfr对象的显示,又不想写全量包装类,可以创建一个仅重写显示方法的轻量包装器,其余操作转发给原对象:
import gmpy2 class MPFRDisplayWrapper: def __init__(self, mpfr_obj): self._obj = mpfr_obj def __repr__(self): return f"{self._obj:.10g}" def __str__(self): return self.__repr__() # 转发所有非显示相关的属性/方法 def __getattr__(self, name): return getattr(self._obj, name) # 使用示例 num = gmpy2.mpfr("1.41421356237309504880168872420969807856967187537694", 512) wrapped_num = MPFRDisplayWrapper(num) print(wrapped_num) # 输出: 1.414213562 # 仍可使用mpfr的原生方法 print(wrapped_num.pow(2)) # 输出: 2.000000000
若需要支持运算(如wrapped_num + 1),只需补充实现对应的运算魔法方法(如__add__),但仅用于显示的话,上述代码足够。
内容的提问来源于stack exchange,提问作者agg
相关产品推荐
相关产品推荐

