Python 3 中 __int__ 和 __index__ 方法有什么区别?
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中实现的。