如何在子类化collections.MutableSequence时实现__delitem__?
根据Alex Martelli的建议,使用collections.MutableSequence,而不是直接继承list()(使用Python 2.6.6)
Alex建议使用
class HostList(collections.MutableSequence):
"""A container for manipulating lists of hosts"""
def __init__(self):
"""Initialize the class"""
self.list = list()
我必须实现__delitem__
,否则MutableSequence会不高兴...
>>> import HostList as H
>>> foo = H.HostList()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class HostList with abstract methods __delitem__
>>>
我也尝试过用return del(ii)
和return self.list.remove(ii)
来构建__delitem__
... 但这些都没有成功。在这种情况下,__delitem__
的正确声明方式是什么呢?
编辑:最后的解决方案是这样做的
def __delitem__(self, ii):
"""Delete an item"""
del self.list[ii] # Thank you @Thomas for the pointer about .remove()
return
1 个回答
5
del ii
和del(ii)
的意思是,你是在函数__delitem__
的作用范围内删除了名字ii
,而不是删除列表里的内容(具体可以参考这个链接:del
)
如果ii
是列表中的一个项目,你可以用:self.list.remove(ii);
来删除它。
如果ii
是列表中某个项目的索引(位置),你可以用:self.list.remove(self.list[ii])
来删除对应的项目。
更新
或者正如@Thomas Wouters所说,使用del self.list[ii]
会更好。