我想在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.
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)
在 Python 3 中我们有漂亮的collections.UserList([list]):
\n\n\n模拟列表的类。实例\xe2\x80\x99s 内容保存在\n 常规列表中,可通过UserList\n 实例的数据属性访问该列表。实例\xe2\x80\x99s 内容最初设置为\n 列表的副本,默认为空列表
\n\n[]。列表可以是任何可迭代的,例如真正的 Python 列表或 UserList 对象。除了支持可变序列的方法和操作之外,UserList 实例还提供以下属性:
\ndata用于存储 UserList 类内容的真实列表对象。
https://docs.python.org/3/library/collections.html#userlist-objects
\n