关于切片方法__getslice__的附加说明

本题可以用__getslice__或__getitem__实现,

__getslice__(self, i, j)
***Python 2.0以后不建议使用:可以使用slice对象作为__getitem__()的参数。Python 3.0以上已废弃该方法。***
求表达式self[i:j]的值,返回的对象应与self具有相同的类型。注意如果i或j没有提供,则它们的值分别被替换为0和sys.maxsize(可以import sys之后使用sys.maxsize这个变量)
如果使用了负值作为索引,则会自动将索引加上序列长度(需要实现__len__(self)方法)。如果__len__方法没有实现则会引发AttributeError。
调整并不保证会将索引调整到正值(仍有可能是负值)。大于序列长度的索引不作自动处理。
如果__getslice__方法未定义,则将创建一个slice对象并以该对象为参数调用__getitem__方法
例:

a[1:3] => a.__getslice__(1, 3)
a[1:] => a.__getslice__(1, sys.maxsize)
a[:] => a.__getslice__(0, sys.maxsize)
a[1:-4] => a.__getslice__(1, -4 + a.__len__())

__getitem__(self, key)
求表达式self[key]的值,对于序列类型,key应该是整数或slice对象。对于切片,key是一个slice对象。
例:

a[1] => a.__getitem__(1)
a[1:3] => a.__getitem__(slice(1, 3))
a[1:] => a.__getitem__(slice(1, None))
a[:] => a.__getitem__(slice(None, None))
a[1:-4] => a.__getitem__(slice(1, -4))
a[::-1] => a.__getitem__(slice(None, None, -1))

slice对象
slice(start, stop, step) 用于表示切片参数,未提供的参数将为None
slice对象提供一个方法slice.indices(self, length),通过提供一个长度length将索引调整到[0, length]区间内,返回的结果是一个元组(start, stop, step),表示起始索引、终止索引和步长(为负则表示反过来走,本次作业可以不实现)

如何使用__getitem__实现切片:

class SomeSequence:
    ...
    def __getitem__(self, key):
        if isinstance(key, int): # 整数索引
            ...
        elif isinstance(key, slice): # 切片
            (start, stop, step) = key.indices(整个序列的长度)
            从start,以step为步长提取到stop

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

*