gpt4 book ai didi

python - 我可以弱引用方法吗?

转载 作者:太空狗 更新时间:2023-10-30 00:41:47 26 4
gpt4 key购买 nike

<分区>

Possible Duplicate:
Why doesn't the weakref work on this bound method?

一点背景:

我试图实现一个 Listener(或 Observer,同样的东西)模式:EventManager 保留对事件感兴趣的所有 Listeners 处理程序的列表。例如,Listener 对象将具有 onEndOfTheWorldEvent 方法,每次发布事件类 EndOfTheWorldEvent 的实例时,EventManager 都会调用该方法。很简单。

除了我想弱引用处理程序,因为我不希望 EventManager 在不再需要 Listener 时让我的处理程序(绑定(bind)方法)保持事件状态。

所以我想“让我们把所有的处理程序都放在一个 WeakSet 中”。我无法让它工作。

我在这里转储代码(或者当我将代码减少到最少时剩下的代码,这里只有一种类型的事件和一种类型的处理程序)。

#! /usr/bin/python
"""

"""
import sys
import weakref

class Listener(object):
def handler(self, event):
print event

class EventManager(object):
def __init__(self):
self.handlers = weakref.WeakSet()
def register(self, listener):
print "Registering..."
self.handlers.add(listener.handler)
CountRefs(listener.handler)
print "Number of handlers registered:", len(self.handlers)
print "Registered."

def CountRefs(what):
print "Hard count:", sys.getrefcount(what)
print "Weak count:", weakref.getweakrefcount(what)

listener = Listener()
em = EventManager()
CountRefs(listener.handler)
em.register(listener)
CountRefs(listener.handler)

结果:

Hard count: 3
Weak count: 0
Registering...
Hard count: 3
Weak count: 0
Number of handlers registered: 0
Registered.
Hard count: 3
Weak count: 0

看起来好像从来没有任何弱引用,集合仍然是空的。

为了让它更简单:

>>> class C(object):
>>> def blah(self):
>>> print "blah"
>>>
>>> c = C()
>>> w = weakref.ref(c.blah)
>>> print w
<weakref at 0x11e59f0; dead>

我不能为方法创建弱引用吗?如果不是,为什么不

所以我想一个解决方法是用 Wea​​kKeyDictionary 替换 WeakSet:键是监听器本身,并为处理程序赋值。事实上,我可以 weakref 我的听众。但它使数据结构变得有点复杂,当需要向所有人广播事件时,该结构中还需要经过一个层次。

你怎么看?

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com