我希望每次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 如果重要的话