说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
在 Python 中,__index__()
是一个特殊方法,它定义了在需要整数值的上下文中如何将对象转换为整数,例如索引或切片。当你将对象传递给内置的 int()
函数或在方括号([]
)中的索引操作中使用它时,会调用这个方法。
调用 object.__index__(self)
方法以实现 operator.index()
以及 Python 需要无损地将数字对象转换为整数对象的场合(例如切片或是内置的 bin(), hex() 和 oct() 函数)。 存在此方法表明数字对象属于整数类型。 必须返回一个整数。
如果未定义 __int__()
, __float__()
和 __complex__()
则相应的内置函数 int(), float() 和 complex() 将回退为 __index__()
。
通过小例子理解:
>>> class Thing(object):
... def __index__(self):
... print('__index__ called!')
... return 1
...
>>> thing = Thing()
>>> list_ = ['abc', 'def', 'ghi']
>>> list_[thing] # __index__ is called
# __index__ called!
# 'def'
>>> dict_ = {1: 'potato'}
>>> dict_[thing] # __index__ is not called
'''
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: <__main__.Thing object at 0x10a13eb10>
'''
>>> dict_ = {thing: 'potato'} # Works if thing is a key
>>> dict_[thing]
# 'potato'
__index__()
方法的存在是为了允许自定义对象在需要整数值的上下文中正常工作。在 Python 中,许多内置的数据类型(例如列表、元组、字符串等)可以被用作索引,因为它们的索引值是整数。当你编写自定义对象时,你可能想让它们也能像内置类型一样被用作索引,这就是 __index__()
方法的作用。
通过定义 __index__()
方法,你可以自定义对象在索引操作中返回的整数值。这使得你的对象可以与标准的序列或其他数据结构一起使用,而无需额外的转换或显式处理。
例如,假设你有一个自定义的日期对象,你可能希望能够将其用作列表的索引,以获取某一天的数据。通过实现 __index__()
方法,你可以让你的日期对象直接在索引操作中使用,而无需先将其转换为整数。这样的设计使得代码更加简洁和易读。
目前,整数和长整数在切片中扮演着特殊的角色,因为它们是切片语法中唯一允许的对象。换句话说,如果X是实现序列协议的对象,那么 X[obj1:obj2]
只有在obj1和obj2都是整数或长整数时才有效。obj1和obj2无法告诉Python它们可以合理地用作序列的索引。这是一个不必要的限制。
例如,在NumPy中,有8个不同的整数标量,对应于8、16、32和64位的无符号和有符号整数。在许多地方,这些类型对象可以合理地用作整数,因为Python需要真正的整数,但由于不兼容的内存布局而无法从Python整数类型继承。应该有某种方法可以告诉Python对象的行为可以像整数一样。
不可能将nb_int(和__int__()
特殊方法)用于此目的,因为该方法用于将对象强制为整数。允许每个可以被强制为整数的对象在Python期望为真整数的任何地方都用作整数是不合适的。例如,如果在切片中使用__int__()
将对象转换为整数,那么在切片中将允许浮动对象,并且x[3.2:5.8]
不会引起错误。
下面是一个示例来说明它的用法:
class MyIndexableObject:
def __init__(self, value):
self.value = value
def __index__(self):
return self.value
obj = MyIndexableObject(2)
# 在索引操作中使用对象
print([1, 2, 3][obj]) # Outputs: 3
# 显式地将对象转换为整数
print(int(obj)) # Outputs: 2
在这个示例中,obj 是 MyIndexableObject 的一个实例。当在索引操作中使用或传递给 int() 函数时,Python会调用 obj 的 __index__()
方法来获取整数值。
https://docs.python.org/zh-cn/3/reference/datamodel.html#object.__index__
更新时间:2024-03-05 17:26:12 标签:python 特殊方法 索引