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

31

Python 3.2文档的数据模型部分__int____index__方法提供以下描述:

object.__int__(self)

调用内置函数[int()]。 应该返回一个整数。

object.__index__(self)

实现operator.index(),同时也在Python需要整数对象时(例如在切片中,或在内置的bin()hex()oct()函数中)被调用。 必须返回一个整数。

我知道它们用于不同的目的,但我无法弄清楚为什么需要两种不同的方法。 这两种方法之间有什么区别? 在我的类中,将__index__ = __int__视为别名是否安全?

2个回答

20

请参阅PEP 357: 允许使用任何对象进行切片。

nb_int方法用于强制转换,因此其意义与此处请求的内容有根本区别。该PEP提供了一种方法,用于将已经被视为整数的东西在Python需要一个整数时向其通知。使用nb_int的最大问题示例是,float对象已经定义了nb_int方法,但不应将float对象用作序列中的索引。

编辑:似乎它已在Python 2.5中实现。


1

我相信你会在PEP 357中找到答案,这个提案的摘要如下:

这个PEP建议在PyNumberMethods中添加一个nb_index 槽和一个__index__特殊方法,以便在Python中需要明确整数的地方(例如切片语法)可以使用任意对象。


5
这并不解释为什么不能只使用__int__ - Mad Physicist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接