Python 3 中 __int__ 和 __index__ 方法有什么区别?

33 投票
2 回答
15515 浏览
提问于 2025-04-15 16:59

Python 3.2 文档中的数据模型部分__int____index__ 方法做了以下说明:

object.__int__(self)

这个方法是用来实现内置的 int() 函数的。它应该返回一个整数。

object.__index__(self)

这个方法是用来实现 operator.index() 的。每当 Python 需要一个整数对象时(比如在切片操作,或者在内置的 bin()hex()oct() 函数中),也会调用这个方法。它必须返回一个整数。

我明白它们是用来不同的目的,但我一直搞不清楚为什么需要两个不同的方法。这两个方法有什么区别呢?在我的类里直接把 __index__ = __int__ 这样写安全么?

2 个回答

1

我相信你可以在 PEP 357 找到答案,里面有这样的摘要:

这个提案建议在 PyNumberMethods 中添加一个 nb_index 插槽,以及一个 __index__ 特殊方法,这样任何对象在 Python 中需要整数的地方都可以使用,比如在切片语法中(这个插槽的名字就是由此而来的)。

20

请查看 PEP 357:允许任何对象用于切片。

nb_int 方法是用来进行类型转换的,所以它的意思和这里请求的内容是完全不同的。这个提案(PEP)建议了一种方法,让那些本身就可以被看作整数的对象,在Python需要整数的时候,能够把这个信息传递给Python。使用 nb_int 的最大问题在于,浮点数对象已经定义了 nb_int 方法,但浮点数对象 不应该 被用作序列的索引。

编辑:看起来这个功能是在Python 2.5中实现的。

撰写回答