开发者社区 > 云原生 > 容器服务 > 正文

实现自定义容器

你想实现一个自定义的类来模拟内置的容器类功能,比如列表和字典。但是你不确定到底要实现哪些方法。

展开
收起
哦哦喔 2020-04-17 15:06:07 661 0
1 条回答
写回答
取消 提交回答
  • collections 定义了很多抽象基类,当你想自定义容器类的时候它们会非常有用。 比如你想让你的类支持迭代,那就让你的类继承 collections.Iterable 即可:
    
    import collections
    class A(collections.Iterable):
        pass
    不过你需要实现 collections.Iterable 所有的抽象方法,否则会报错:
    
    >>> a = A()
    Traceback (most recent call last):
        File "<stdin>", line 1, in <module>
    TypeError: Can't instantiate abstract class A with abstract methods __iter__
    >>>
    你只要实现 __iter__() 方法就不会报错了(参考4.2和4.7小节)。
    
    你可以先试着去实例化一个对象,在错误提示中可以找到需要实现哪些方法:
    
    >>> import collections
    >>> collections.Sequence()
    Traceback (most recent call last):
        File "<stdin>", line 1, in <module>
    TypeError: Can't instantiate abstract class Sequence with abstract methods \
    __getitem__, __len__
    >>>
    下面是一个简单的示例,继承自上面Sequence抽象类,并且实现元素按照顺序存储:
    
    class SortedItems(collections.Sequence):
        def __init__(self, initial=None):
            self._items = sorted(initial) if initial is not None else []
    
        # Required sequence methods
        def __getitem__(self, index):
            return self._items[index]
    
        def __len__(self):
            return len(self._items)
    
        # Method for adding an item in the right location
        def add(self, item):
            bisect.insort(self._items, item)
    
    
    items = SortedItems([5, 1, 3])
    print(list(items))
    print(items[0], items[-1])
    items.add(2)
    print(list(items))
    可以看到,SortedItems跟普通的序列没什么两样,支持所有常用操作,包括索引、迭代、包含判断,甚至是切片操作。
    
    这里面使用到了 bisect 模块,它是一个在排序列表中插入元素的高效方式。可以保证元素插入后还保持顺序。
    
    2020-04-17 15:06:16
    赞同 展开评论 打赏
问答分类:

国内唯一 Forrester 公共云容器平台领导者象限。

相关电子书

更多
阿里云文件存储 NAS 在容器场景的最佳实践 立即下载
何种数据存储才能助力容器计算 立即下载
《容器网络文件系统CNFS》 立即下载