Python 如何添加具有回调功能的WeakValueDictionary?

Python 如何添加具有回调功能的WeakValueDictionary?,python,python-3.x,weak-references,Python,Python 3.x,Weak References,如何将回调函数传递给这些字典?因此,如果任何对象被垃圾回收,将调用该函数 import weakref def call_back(): print("call back function called") we_dict_demo = weakref.WeakKeyDictionary() 或 我认为这没有实际意义,但尝试一下很有趣: import weakref def callback(elem): print(elem, "gc'ed!") # After r

如何将回调函数传递给这些字典?因此,如果任何对象被垃圾回收,将调用该函数

import weakref

def call_back():
    print("call back function called")

we_dict_demo = weakref.WeakKeyDictionary()


我认为这没有实际意义,但尝试一下很有趣:

import weakref

def callback(elem):
    print(elem, "gc'ed!")


# After reading lib/weakref.py it's clear what 
# WeakKeyDictionary pushes as callback self._remove, 
# which constructed in __init__, so let's redefine it
class MyWeakKeyDict(weakref.WeakKeyDictionary):
    def __init__(self, cb, dict=None):
        super().__init__(dict)
        self.cb = cb

        def new_remove(el, selfref=weakref.ref(self)):
            self = selfref()
            if self is not None:
                self.cb(el)
                self._old_remove(el)

        self._old_remove = self._remove
        self._remove = new_remove


class C:
    pass

c = C()
#d = weakref.WeakKeyDictionary()
# Use our class instead of WeakKeyDictionary
d = MyWeakKeyDict(callback)

d[c] = 0

print('Before gc', list(d.items()))
del c
print('After gc', list(d.items()))

结果是

Before gc [(<__main__.C object at 0x000002690F53A588>, 0)]
<weakref at 0x000002690F54A728; dead> gc'ed!
After gc []
gc[(0)之前的

gc'ed!
在gc[]之后

您可以在
\uuuu del\uuuu
中放置一些内容,但不能保证它会被调用。谢谢heemayl,但我需要类似的功能,如用于单个对象的功能。r=weakref.ref(obj,回调),但在字典中,对象可以用作键或值。每当垃圾收集器删除对象时,每次回调()时都应调用该对象
Before gc [(<__main__.C object at 0x000002690F53A588>, 0)]
<weakref at 0x000002690F54A728; dead> gc'ed!
After gc []