Я изучаю, могу ли я реализовать простую функцию обратного вызова в python. Я думал, что смогу использовать для этого слабыйref.WeakSet, но есть кое-что, что я пропускаю или неправильно понял. Как вы можете видеть в коде, я сначала попробовал со списком методов обратного вызова в объектах ClassA, но понял, что это сохранит объекты, которые были добавлены в список активных вызовов. Вместо этого я попытался использовать weakref.WeakSet, но это тоже не делает трюк (по крайней мере, не так). Комментарии в последних четырех строках кода объясняют, что я хочу.
Может ли кто-нибудь помочь мне с этим?
from weakref import WeakSet
class ClassA:
def __init__(self):
#self.destroyCallback=[]
self.destroyCallback=WeakSet()
def __del__(self):
print('ClassA object %d is being destroyed' %id(self))
for f in self.destroyCallback:
f(self)
class ClassB:
def destroyedObjectListener(self,obj):
print('ClassB object %d is called because obj %d is being destroyed'%(id(self),id(obj)))
a1=ClassA()
a2=ClassA()
b=ClassB()
a1.destroyCallback.add(b.destroyedObjectListener)
#a1.destroyCallback.append(b.destroyedObjectListener)
print('destroyCallback len() of obj: %d is: %d'%(id(a1),len(a1.destroyCallback))) # should be 1
a2.destroyCallback.add(b.destroyedObjectListener)
#a2.destroyCallback.append(b.destroyedObjectListener)
print('destroyCallback len() of obj: %d is: %d'%(id(a2),len(a2.destroyCallback))) # should be 1
del a1 # Should call b.destroyedObjectListener(self) in its __del__ method
del b # should result in no strong refs to b so a2 WeakSet should automatically remove added item
print('destroyCallback len() of obj: %d is: %d'%(id(a2),len(a2.destroyCallback))) # should be 0
del a2 # Should call __del__ method
UPDATE: решение, основанное на принятом ответе, можно найти в github: git @github.com: thgis/PythonEvent.git