Python Pyglet处理程序和已删除对象

Python Pyglet处理程序和已删除对象,python,pyglet,Python,Pyglet,在我与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):

在我与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
删除对成员的所有引用并将其删除(),组中的处理程序是否会阻止对象被垃圾收集?操纵者会消失吗?如果没有,我如何清理处理程序

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

>>> 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
pyglet.event import EventDispatcher中的
>>
>>>类组(EventDispatcher):
...  通过
... 
>>>组。注册事件类型('on_tick')
“在滴答声中”
>>>g=组()
>>>班级成员:
...  勾选上的def(自身):
...   打印('勾选')
... 
>>>m=成员()
>>>g.push_处理器(m)
>>>g.调度事件(“在刻度上”)
打上钩
>>>德尔姆
>>>g.调度事件(“在刻度上”)
打上钩
>>>B类:
...  勾选上的def(自身):
...   打印(self.x)
... 
>>>m=B()
>>>g.push_处理器(m)
>>>g.调度事件(“在刻度上”)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/usr/lib/python3.2/site packages/pyglet/event.py”,第355行,在dispatch_事件中
如果处理程序(*args):
文件“”,第3行,勾选
AttributeError:“B”对象没有属性“x”
>>>m.x=3
>>>g.调度事件(“在刻度上”)
3.
打上钩
>>>德尔姆
>>>g.调度事件(“在刻度上”)
3.
打上钩

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

EventDispatcher.remove\u处理程序与push\u处理程序相反。因此,调用remove_handlers(m),然后delm将允许对m进行垃圾收集