2012-09-01 23 views
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 

所以我想此事件仍保持對處理程序的引用。因此,問題變成了如何清理處理程序。

回答

1

EventDispatcher.remove_handlers與push_handlers相反。所以調用remove_handlers(m)然後del m將允許m被垃圾收集。