# 序列协议

# 序列协议

在Python中,序列是指一种可以通过索引访问其中元素的数据类型,包括字符串、列表、元组等。序列协议定义了Python序列类型应该实现的一组标准接口,以便于在使用序列类型的过程中能够保持一致性和通用性。

Python序列协议要求序列类型实现以下特殊方法:

  • __len__(self)​:返回序列中元素的数量。
  • __getitem__(self, index)​:返回序列中指定位置的元素,其中index​是元素的索引值,从0开始计数,也可以使用负数索引从序列末尾开始反向索引。
  • __setitem__(self, index, value)​:将序列中指定位置的元素设置为指定的值,其中index​是元素的索引值,从0开始计数。
  • __delitem__(self, index)​:从序列中删除指定位置的元素,其中index​是元素的索引值,从0开始计数。

此外,还有一些其他的方法可以使序列类型更加强大和灵活,例如:

  • __contains__(self, value)​:检查序列中是否包含指定的值。
  • index(self, value)​:返回序列中第一个与指定值匹配的元素的索引值。
  • count(self, value)​:返回序列中指定值的出现次数。

实现了序列协议的对象可以支持常见的序列操作,例如索引、切片、迭代、拼接等。这些操作可以使用通用的方式进行,无需关心序列类型的具体实现细节。

并且,通常并不需要实现所有方法,例如仅仅实现__getitem__(self, index)​也可以实现迭代和切片,其中的缘由可以认为是Python的虚拟机会做一些“智能化的”检查。

class MySeq:
    def __init__(self):
        self.l = list(range(10))
  
    def __getitem__(self, index):
        return self.l.__getitem__(index)

seq = MySeq()
for i in seq:
    print(i,end='-')    # 0-1-2-3-4-5-6-7-8-9-

print('\n',seq[:-1])    # [0, 1, 2, 3, 4, 5, 6, 7, 8]