我希望每次heapq.heapify函数更改堆列表中的元素时都收到回调通知(顺便说一句,需要跟踪列表中的对象以及它们的索引如何更改)。
我的计划是继承list并覆盖__setitem__我将跟踪列表中更改的方法。所以这是子类:
class List2(list):
def __setitem__(self, key, value):
print 'setitem: key=',key,' value=',value
list.__setitem__(self, key, value)
def __getitem__(self, key):
print 'getitem: key=',key
return list.__getitem__(self, key)
然后我创建一个实例List2并为它调用 heapify:
h = List2([12, -3, 0, 5, 1, 7])
heapq.heapify(h)
问题是覆盖__setitem__的不是从内部调用的heapq.heapify。看起来heapq.heapify将 List2 的实例视为默认列表。我想这与heapq.heapify内置函数的事实有关,但我仍然不明白。
为什么__setitem__不调用被覆盖的对象heapq.heapify?
这里有趣的是,如果我将 heapq 的代码复制粘贴到我的本地模块中(因此它不再是内置函数),那么它会按预期工作并且我会调用List2.__settiem__,但它不适用于默认 (内置)heapq。
Python 2.7 如果重要的话