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

如何修改导入的不可变类型类的__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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 13:52:40