Python 3.5:int don';你不调用_索引_方法吗?

Python 3.5:int don';你不调用_索引_方法吗?,python,python-3.x,Python,Python 3.x,我不知道什么时候调用类的\uuuu index\uuu方法。我假设在索引操作中使用对象时会调用该方法。当对象是int的子类时,我看不到调用\uuuuuuuu索引\uuuuuuuuu In [1]: class foo(int): ...: def __new__(cls, value): ...: return int.__new__(cls, value) ...: def __index__(self): ...: re

我不知道什么时候调用类的
\uuuu index\uuu
方法。我假设在索引操作中使用对象时会调用该方法。当对象是
int
的子类时,我看不到调用
\uuuuuuuu索引\uuuuuuuuu

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.\uuu index\uuu()
。我误解了什么


编辑以简化和更正示例。

\uuuuu索引
实现到
int
的无损转换。Python只在实际需要这样的转换时调用
\uuuuuuuuuuuuuuuuuuuuuuuuuuu
。在您的例子中,它不需要转换,因为您的
i
已经是一个int。Python只是直接使用int值


如果您想查看处理此问题的代码,请参阅。

\uuuu index\uuuu
实现到
int
的无损转换。Python只在实际需要这样的转换时调用
\uuuuuuuuuuuuuuuuuuuuuuuuuuu
。在您的例子中,它不需要转换,因为您的
i
已经是一个int。Python只是直接使用int值


如果您想查看处理此问题的代码,请参阅。

您没有误解任何内容。请参阅“为了拥有一个一致的整数类型类,当定义了_index _;()时,还应定义_int _;(),两者都应返回相同的值。”似乎您现在有一个问题相关:@Jean François Fabre是的,我现在有一个问题,谢谢大家。您没有误解任何东西。请参阅“为了有一个一致的整数类型类,当定义了uu index uu()时,也应该定义u int u(),两者都应该返回相同的值。”看来你现在有问题了:@Jean-François Fabre是的,我现在确实有问题,谢谢大家。