Python 实现自定义容器 问题
你想实现一个自定义的类来模拟内置的容器类功能,比如列表和字典。但是你不确定到底要实现哪些方法。
Python 实现自定义容器 解决方案
collections
定义了很多抽象基类,当你想自定义容器类的时候它们会非常有用。 比如你想让你的类支持迭代,那就让你的类继承 collections.Iterable
即可:
不过你需要实现 collections.Iterable
所有的抽象方法,否则会报错:
你只要实现 __iter__()
方法就不会报错了(参考4.2和4.7小节)。
你可以先试着去实例化一个对象,在错误提示中可以找到需要实现哪些方法:
下面是一个简单的示例,继承自上面Sequence抽象类,并且实现元素按照顺序存储:
可以看到,SortedItems跟普通的序列没什么两样,支持所有常用操作,包括索引、迭代、包含判断,甚至是切片操作。
这里面使用到了 bisect
模块,它是一个在排序列表中插入元素的高效方式。可以保证元素插入后还保持顺序。
Python 实现自定义容器 讨论
使用 collections
中的抽象基类可以确保你自定义的容器实现了所有必要的方法。并且还能简化类型检查。 你的自定义容器会满足大部分类型检查需要,如下所示:
collections
中很多抽象类会为一些常见容器操作提供默认的实现, 这样一来你只需要实现那些你最感兴趣的方法即可。假设你的类继承自 collections.MutableSequence
,如下:
如果你创建 Items
的实例,你会发现它支持几乎所有的核心列表方法(如append()、remove()、count()等)。 下面是使用演示:
本小节只是对Python抽象类功能的抛砖引玉。numbers
模块提供了一个类似的跟整数类型相关的抽象类型集合。