我如何在python中创建自定义列表类?

K M*_*hta 27 python list

我想在Python中编写一个自定义列表类(让我们称之为MyCollection),我最终可以调用它:

for x in myCollectionInstance:
    #do something here
Run Code Online (Sandbox Code Playgroud)

我该怎么做呢?是否有一些我必须扩展的类,或者是否有任何我必须覆盖的函数才能这样做?

jen*_*ena 29

list如果您的集合基本上像列表一样,则可以子类化:

class MyCollection(list):
    def __init__(self, *args, **kwargs):
        super(MyCollection, self).__init__(args[0])
Run Code Online (Sandbox Code Playgroud)

但是,如果您的主要愿望是您的集合支持迭代器协议,则只需提供一个__iter__方法:

class MyCollection(object):
    def __init__(self):
        self._data = [4, 8, 15, 16, 23, 42]

    def __iter__(self):
        for elem in self._data:
            yield elem
Run Code Online (Sandbox Code Playgroud)

这允许您迭代任何实例MyCollection.


Ign*_*ams 24

Python语言参考,§3.4.6,"模拟容器类型"

  • 不必要.`for`也将从索引0迭代到`__getitem __()`引发异常; 有关详细信息,请参阅链接文档 (4认同)
  • 你能从仅限链接更新吗? (2认同)

Mik*_*ton 13

我喜欢MutableSequence按照Alex Martelli的建议继承.这对我很有用,特别是当我需要在我正在构建的列表的顶部添加自定义方法时.

from collections import MutableSequence

class MyList(MutableSequence):
    """A container for manipulating lists of hosts"""
    def __init__(self, data=None):
        """Initialize the class"""
        super(MyList, self).__init__()
        if (data is not None):
            self._list = list(data)
        else:
            self._list = list()

    def __repr__(self):
        return "<{0} {1}>".format(self.__class__.__name__, self._list)

    def __len__(self):
        """List length"""
        return len(self._list)

    def __getitem__(self, ii):
        """Get a list item"""
        return self._list[ii]

    def __delitem__(self, ii):
        """Delete an item"""
        del self._list[ii]

    def __setitem__(self, ii, val):
        # optional: self._acl_check(val)
        self._list[ii] = val

    def __str__(self):
        return str(self._list)

    def insert(self, ii, val):
        # optional: self._acl_check(val)
        self._list.insert(ii, val)

    def append(self, val):
        self.insert(len(self._list), val)

if __name__=='__main__':
    foo = MyList([1,2,3,4,5])
    foo.append(6)
    print foo  # <MyList [1, 2, 3, 4, 5, 6]>
Run Code Online (Sandbox Code Playgroud)

  • `if not not(数据为None):`这不是你编写python代码的方式,直到你成为一名大绝地大师."如果数据不是无" - 这看起来不错. (6认同)
  • 确实,此外,我想只有“if data:”应该可以正常工作。 (2认同)

ram*_*sus 7

在 Python 3 中我们有漂亮的collections.UserList([list])

\n\n
\n

模拟列表的类。实例\xe2\x80\x99s 内容保存在\n 常规列表中,可通过UserList\n 实例的数据属性访问该列表。实例\xe2\x80\x99s 内容最初设置为\n 列表的副本,默认为空列表[]。列表可以是任何可迭代的,例如真正的 Python 列表或 UserList 对象。

\n\n

除了支持可变序列的方法和操作之外,UserList 实例还提供以下属性:data用于存储 UserList 类内容的真实列表对象。

\n
\n\n

https://docs.python.org/3/library/collections.html#userlist-objects

\n