在Python中我们可以使用__get__item__、__len__等方法去创建类似于序列和映射的类。这种方法的好处是可以像列表一样使用索引功能访问元素。
魔术方法的作用:
__getitem__(self,key):返回键对应的值。
__setitem__(self,key,value):设置给定键的值
__delitem__(self,key):删除给定键对应的元素。
__len__():返回元素的数量
【注释】只要实现了__getitem__和 __len__方法,就会被认为是序列。
# coding=utf-8
class GetItemTest(object):
def __init__(self, data: list):
self.data = data
def __getitem__(self, item):
return self.data[item]
def __len__(self):
return len(self.data)
- 定义了__len__()函数之后使用len()来查看序列的长度。
data = list(range(10))
git = GetItemTest(data)
print(f"length = len(git)")
输出:
length = 10
- __get_item__()函数可以对序列进行索引、切片等操作。当我们使用git的进行 [] 操作的时候会被__get_item__()拦截,从而执行函数内部的操作内容。
data = list(range(10))
git = GetItemTest(data)
print(f"slice data = {git[2:5]}")
输出:
slice data = [2, 3, 4]
- 在for…in 操作上的使用,既然是序列当然可以使用for来遍历,超过索引上限之后引发IndexError的异常从而结束。
data = list(range(10))
git = GetItemTest(data)
for v in git:
print(v, end=',')
else:
print('\b')
注意点:
__len__并不是for…in方法的索引次数,真正停止的信息是IndexError或者StopIteration异常,如果类里面的列表不会自动触发该异常,需要手动触发。