我正在研究是否可以在python中實現簡單的回調函數。我認爲我可以使用weakref.WeakSet來做這件事,但顯然有一些我錯過了或者被誤解了。正如你在代碼中看到的,我首先嚐試了'ClassA'對象中的回調方法列表,但是意識到這會使已添加到回調列表的對象保持活動狀態。相反,我嘗試使用weakref.WeakSet,但也沒有辦法(至少不是這樣)。最後四行代碼中的評論解釋了我想要發生的事情。使用python 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's 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上找到:[email protected]:thgis/PythonEvent.git
我現在有你的建議,它似乎很好。我已經將解決方案包裝在一個Event類中,並且只實現了add(),remove()和signal()以最小限度地使用。也許它會擴大。如果有人願意,可以使用github從github上下載解決方案:[email protected]:thgis/PythonEvent.git – thomas