如何在模拟int的类上支持%x格式

问题描述 投票:5回答:1

我还没有看到这样做的方法。我在Python 3.6.1(v3.6.1:69c0db5050,2017年3月21日,01:21:04)。虽然我们需要在Python 2上使用它,但是Sierra下的MacOS。

我有一个自定义类,它看起来像一个带有子字段解码的int。出于我自己的原因,我希望能够做到这两样的事情

inst * 4

inst.subfield << 1

(其中子字段是inst的属性)。这些对象高度过载,例如打印inst将转储子字段以供查看。

这一切都是通过重载所有自定义函数来处理数学和与其他对象的交互来完成的。一般来说,它的效果非常好,有一个明显的例外:打印。在大多数情况下,用户可以忘记这不是一个真正的整数并使用它像一个,但使用整数打印命令将无法正常工作:

print("%#x"%inst)
TypeError: %x format: an integer is required, not CustomType

我确实有__int__重载,并且int(inst)按预期返回一个整数。

有没有办法让这项工作?这是一个小麻烦,但我想解决一个问题。

此外,我确实实施了__format__。所以'{0:x}'.format(inst)工作,但上面的印刷品没有。

谢谢!

python string-formatting
1个回答
7
投票

你需要实现__int____index__

class X(object):
    def __int__(self):
        return 42
    def __index__(self):
        return 42

x = X()
print('%#x' % x)

输出:

0x2a

来自__index__的文档:

调用实现operator.index(),并且只要Python需要无损地将数字对象转换为整数对象(例如在切片中,或在内置bin(),hex()和oct()函数中)。此方法的存在表明数字对象是整数类型。必须返回一个整数。

所以__index__hex()调用,可以通过查看PyNumber_ToBase中的相关源代码看到。

© www.soinside.com 2019 - 2024. All rights reserved.