Python 3.5 : subclasses of int don't call the __index__ method?

标签 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__() 。我误解了什么?

进行编辑以简化和更正示例。

最佳答案

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

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

关于Python 3.5 : subclasses of int don't call the __index__ method?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54524453/

相关文章:

python - 当参数默认为 None 时使用 __repr__,但可能是一个 str

python-3.x - 将多列合并为一列并计算唯一值的重复次数,并为 Pandas 数据框中的每个计数维护一个单独的列

python - 在列表中没有分隔符的情况下在多个分隔符处拆分

python - 使用 Python、Ruby 和 Perl 重新编译 MacPort 版本的 MacVim

python - 如何遍历文件并保存使用 OpenCV 应用的转换?

python - 如何使用python-docx替换Word文档中的文本并保存

python - 寻找一种更快的模糊字符串匹配方法

python - 当值为零时如何完全删除箭袋箭头

Python3 如何从 os.walk 获取当前目录和下一个目录?

python - web.py 应用程序上的 Pytests 未覆盖方法代码