2
在我的遊戲使用Python和pyglet,我有一個傳播事件向下給其成員組:Pyglet處理程序和刪除的對象
class Group(EventDispatcher):
def __init__(self):
self.members = []
def add(self, member):
self.members.append(member)
self.push_handlers(member)
def remove(self, member):
self.members.remove(member)
# and then what???
Group.register_event('on_event')
如果我del
我的所有的成員和remove()的話,會引用組中的處理程序阻止對象被垃圾收集?處理程序是否會消失(weakref)?如果不是,我怎樣才能清理處理程序?
編輯:我跑我測試環節,看看會發生什麼:
>>> from pyglet.event import EventDispatcher
>>> class Group(EventDispatcher):
... pass
...
>>> Group.register_event_type('on_tick')
'on_tick'
>>> g = Group()
>>> class Members:
... def on_tick(self):
... print('tick')
...
>>> m = Members()
>>> g.push_handlers(m)
>>> g.dispatch_event('on_tick')
tick
>>> del m
>>> g.dispatch_event('on_tick')
tick
>>> class B:
... def on_tick(self):
... print(self.x)
...
>>> m = B()
>>> g.push_handlers(m)
>>> g.dispatch_event('on_tick')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.2/site-packages/pyglet/event.py", line 355, in dispatch_event
if handler(*args):
File "<stdin>", line 3, in on_tick
AttributeError: 'B' object has no attribute 'x'
>>> m.x = 3
>>> g.dispatch_event('on_tick')
3
tick
>>> del m
>>> g.dispatch_event('on_tick')
3
tick
所以我想此事件仍保持對處理程序的引用。因此,問題變成了如何清理處理程序。