python网站地址:https://docs.python.org/zh-cn/3/reference/datamodel.html#object.getitem
属于Pytohon中的特殊方法,如下地址有详细的介绍:https://www.cnblogs.com/hotbaby/p/4913363.html
object.getitem(self, key)
调用此方法以实现 self[key] 的求值。对于序列类型,接受的键应为整数和切片对象。请注意负数索引(如果类想要模拟序列类型)的特殊解读是取决于 getitem() 方法。如果 key 的类型不正确则会引发 TypeError 异常;如果为序列索引集范围以外的值(在进行任何负数索引的特殊解读之后)则应引发 IndexError 异常。对于映射类型,如果 key 找不到(不在容器中)则应引发 KeyError 异常。
注解 for 循环在有不合法索引时会期待捕获 IndexError 以便正确地检测到序列的结束。
以下是两个有关__getitem__的例子
class Getitem_test():
def __init__(self,data):
self.data=data
def __getitem__(self, item):
print("index",item)
return self.data[item]
X=Getitem_test('nice')
print('X的type:',type(X))
print('X.data的type:',type(X.data))
print('...............')
print('X[0]:',X[0])#在读取X[0]时是调用的getitem
print('...............')
for item in X:
print(type(item),'item:',item)
运行的结果如下:
X的type: <class '__main__.Getitem_test'>
X.data的type: <class 'str'>
...............
index 0
X[0]: n
...............
index 0
<class 'str'> item: n
index 1
<class 'str'> item: i
index 2
<class 'str'> item: c
index 3
<class 'str'> item: e
index 4
class Getitem_test():
def __init__(self,data):
self.data=data
def __getitem__(self, item):
print("index",item)
# return self.data[item]
return 'hello'#在这里只是return了一个字符串,没有用到item,虽然item还是会从0开始逐渐增加,但是在for item in X中,item一直是‘hello’,也就不会停止了。也就是说每次都会调用getitem。
X=Getitem_test('nice')
print('X的type:',type(X))
print('X.data的type:',type(X.data))
print('...............')
print('X[0]:',X[0])
print('...............')
for item in X:
print(type(item),'item:',item)
运行结果(会一直循环下去):
X的type: <class '__main__.Getitem_test'>
X.data的type: <class 'str'>
...............
index 0
X[0]: hello
...............
index 0
<class 'str'> item: hello
index 1
<class 'str'> item: hello
index 2
<class 'str'> item: hello
index 3
<class 'str'> item: hello
index 4
<class 'str'> item: hello
object.setitem(self, key, value)
调用此方法以实现向 self[key] 赋值。注意事项与 getitem() 相同。为对象实现此方法应该仅限于需要映射允许基于键修改值或添加键,或是序列允许元素被替换时。不正确的 key 值所引发的异常应与 getitem() 方法的情况相同。
object.delitem(self, key)
调用此方法以实现 self[key] 的删除。注意事项与 getitem() 相同。为对象实现此方法应该权限于需要映射允许移除键,或是序列允许移除元素时。不正确的 key 值所引发的异常应与 getitem() 方法的情况相同。