Python 3.5:int的子类不会调用__index__方法吗?

时间:2019-02-04 21:19:05

标签: python python-3.x

我对何时调用类的__index__方法感到困惑。我曾假设在索引操作中使用过该对象时将调用该方法。当对象是__index__的子类时,我没有看到int被调用。

In [1]: class foo(int):
...:        def __new__(cls, value):
...:            return int.__new__(cls, value)
...:        def __index__(self):
...:            return int(self)+1

In [2]: i=foo(0)

In [3]: i
Out[3]: 0

In [4]: i.__index__()
Out[4]: 1

In [5]: [0,1,2][:i.__index__()]
Out[5]: [0]

In [6]: [0,1,2][:i]
Out[6]: []

似乎int(i)被用作索引,而不是i.__index__()。我误会了什么?

经过编辑以简化和纠正示例。

1 个答案:

答案 0 :(得分:0)

__index__实现了对int的无损转换。 Python仅在确实需要这种转换时才调用__index__。就您而言,它不需要转换,因为您的i已经是一个int值。 Python只是直接使用int值。

如果您想查看处理此问题的代码,则位于PyNumber_Index下。