在Python中挂钩添加/删除列表项

4

我想创建一个Python list 的替代品,可以让我知道何时添加或删除了项目。一个list 子类或实现列表接口的其他方案同样适用。尽管我更喜欢不必重新实现所有list功能的解决方案。有没有一种简单且符合 Python 风格的方法?

伪代码:

class MyList(list):
    # ...
    def on_add(self, items):
        print "Added:"
        for i in items:
            print i

    # and the same for on_remove

l = MyList()
l += [1,2,3]
# etc.

2
我认为您需要重写appendextend和(有点棘手的)__setitem__方法。 - Thomas K
不要覆盖list(虽然这是正确的做法,但有点棘手),你可以编写一个小包装器,它只实现你需要的API。 - static_rtti
2个回答

5

要查看在列表中定义的函数,您可以执行以下操作:

>>> dir(list)

然后您将看到哪些内容可以被覆盖,例如尝试以下内容:

class MyList(list):
    def __iadd__(self, *arg, **kwargs):
        print "Adding"
        return list.__iadd__(self, *arg, **kwargs)

您可能需要再做一些来获取全部内容。

__iadd__ 就是它了。我尝试使用 __setitem__,并且想知道为什么控制没有跟随那个函数。 - Senthil Kumaran

2
userlist文档告诉你,如果你不需要在Python <2.2中工作,那么应该继承list。你可能不能避免覆盖至少允许添加/删除元素的方法。请注意,这包括切片操作符。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接