如何更改不可变类型的导入类的__repr__

How to change __repr__ for an imported class of immutable type

提问人:agg 提问时间:11/8/2023 更新时间:11/8/2023 访问量:31

问:

我用来处理高精度浮点数(>500 位精度)。我的代码包含一长串这样的浮点数,例如gmpy2

import gmpy2

gmpy2.get_context().precision = 500
rs = gmpy2.random_state()
lst = [gmpy2.mpfr_random(rs) for _ in range(4)]
print(lst)

# [mpfr('0.271521109675768030046267124634073667684105281814578550174956682310741033886748
#  70742194330013240808110139077875599032334632394117927746462940740105086152',500), mpfr('0.651
#  70987608257463499855942595039172347625432569368637954337608487459435530015416379355871
#  784576133166076679114013337947978739119046252118327755675301311',500), mpfr('0.250491752647
#  45810463315271935029178260478893809777157454094624870772157985848539893902700198
#  946816912841670920043748676653996297679708199369887486126487',500), mpfr('0.35225 ...

正如您在此示例中看到的,输出往往是不可读的,因为将所有数字打印到屏幕上。我知道在这个例子中,我可以简单地格式化输出mpfr.__repr__

print([f'{l}' for l in lst])
# ['0.271521', '0.651710', '0.250492', '0.352256']

但是,我也有内部包含 s 的类,并且自动生成的表示形式看起来更紧凑会很方便,例如只有 10 位数字。mpfr

我尝试覆盖该方法,但幼稚的尝试失败了:__repr__

BigFloat = gmpy2.mpfr
BigFloat.__repr__ = lambda self: 'bigfloat'

# TypeError: cannot set '__repr__' attribute of immutable type 'mpfr'

我还尝试创建一个继承自 mpfr 的新类,但这也不起作用

class BigFloat(gmpy2.mpfr):

    def __repr__(self):
        return 'bigfloat'

# TypeError: type 'mpfr' is not an acceptable base type

我知道我可以创建一个内部包含 .然后我会重新实现所有魔术方法,例如 , , ...基于类。但是有没有更简洁/优雅的解决方案?BigFloatgmpy2.mpfr__add____neg__mpfr

python gmp gmpy

评论

0赞 Michael Butscher 11/8/2023
至少使用会更简洁。__getattr__
0赞 quamrana 11/8/2023
关于代理对象的这个问题的答案有帮助吗?您可以有一个代理来转发除 .__repr__()
1赞 Alperino 11/8/2023
顺便说一句,如果您的目标是数字的可读打印,您通常会覆盖 ,而不是 .后者旨在生成尽可能精确的字符串表示形式,因此在那里打印所有数字是有意义的。__str____repr__

答: 暂无答案