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):
        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 被垃圾回收。

关于python - Pyglet 处理程序和删除的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12231929/

相关文章:

python - 如何创建一个全部为 True 或全部为 False 的 numpy 数组?

python - 通过字典访问函数

python - 检测pyglet(python)中的两个同时键

python - 用 Pymunk 摆动 Spring

python - PyOpenGl 还是 pyglet?

python - 运行 pip install --allow external 时 Mysql python 连接器不可用

python - Django:复杂的注释,如何避免for循环?

python - 如何使用python删除语料库中的人名

python - 对 3D 图形(圆柱体)进行纹理处理

python - Pyglet被多次调用后停止播放声音