Python高级编程(22):实现可切片的对象
我们来看一段代码,注意一下这里的start和end指的都是索引号,不是值(如[3:6]就是指索引号为3/4/5的元素,索引号从0开始):
1 | # 模式[start:end:step] |
看完上面的我们再来看下面的,注意各步之间无任何关联,各步均和第一步产生反应:
1 | aList = [3, 4, 5, 6, 7, 9, 11, 13, 15, 17] |
我们来仔细看一下到底发生了什么:
1 | aList = [1, 2, 4, 4, 5, 6] |
现在我们是需要自己来定义一个可以像列表那样的,支持各种切片处理的对象(我们实现一个不可变的对象)。我们查看源码,看这个Sequence里面包含了哪些魔法函数,我们先把里面的魔法函数都复制一遍:
1 | from Lib import _collections_abc |
将光标放在_collections_abc上面,然后按住Ctrl,单击鼠标左键就可以查看源码了:
1 | __all__ = ["Awaitable", "Coroutine", |
然后我们类似操作选择点击Sequence,它就是不可变的,右边的MutableSequence就是可变的,其实就是在他的基础上进行了一些封装,功能多了而已。发现它实现了4个魔法函数,我们把它们写到Group里面:
1 | class Group: |
发现运行没有报错,说明它就已经支持我们的切片操作了,因为里面具有__getitem__()
这个魔法函数。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 余思博客!
评论