如何在子类化collections.MutableSequence时实现__delitem__?

4 投票
1 回答
5652 浏览
提问于 2025-04-16 15:20

根据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 iidel(ii)的意思是,你是在函数__delitem__的作用范围内删除了名字ii,而不是删除列表里的内容(具体可以参考这个链接:del

如果ii是列表中的一个项目,你可以用:self.list.remove(ii);来删除它。

如果ii是列表中某个项目的索引(位置),你可以用:self.list.remove(self.list[ii])来删除对应的项目。

更新

或者正如@Thomas Wouters所说,使用del self.list[ii]会更好。

撰写回答