Skip to main content
 首页 » 编程设计

python之Pyglet 处理程序和删除的对象

2025年05月04日10lhb25

在我使用 Python 和 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 我对一个成员的所有引用并删除()它,Group 中的处理程序是否会阻止该对象被垃圾回收?处理程序会消失吗(weakref)?如果没有,我该如何清理处理程序?

编辑:我运行了测试 session 以查看会发生什么:

>>> 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 

所以我猜 EventDispatcher 仍然保留对处理程序的引用。因此,问题就变成了如何清理处理程序。

请您参考如下方法:

EventDispatcher.remove_handlers 与 push_handlers 相反。因此调用 remove_handlers(m) 然后调用 del m 将允许 m 被垃圾回收。