如何在模拟int

时间:2018-03-05 20:11:27

标签: python string-formatting

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

我有一个自定义类,它通过子字段解码看起来像一个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)有效,但上面的印刷品没有。

谢谢!

1 个答案:

答案 0 :(得分: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中的相关源代码来看到。