可能性の重複:
Why doesn't the weakref work on this bound method?弱参照メソッドは使用できますか?
コンテキストのビット:
私は、リスナー(またはオブザーバー、同じこと)パターンを実装しようとしていた:EventManagerは、リストを保持していますイベントに関心のあるすべてのListenersハンドラのうちの1つです。たとえば、リスナーオブジェクトはonEndOfTheWorldEvent
メソッドを持ち、イベントクラスEndOfTheWorldEventのインスタンスが転記されるたびにEventManagerによって呼び出されます。簡単です。
リスナーがもう必要なくなったときにEventManagerがハンドラ(バインドされたメソッド)を有効にしないようにするために、ハンドラを弱くしたかったのを除きました。
私は「すべてのハンドラーをWeakSetに投げよう」と考えました。私はそれを働かせることができませんでした。
ここにコードをダンプします(または、最小限に抑えるために残っているものは、ここでは1つのタイプのイベントと1つのタイプのハンドラのみです)。
#! /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>
私はすべてのメソッドにweakrefsを作成できません:
は、それがさらに簡単にするには?そうでない場合、 なぜ?私はWeakSetをWeakKeyDictionaryに置き換えることをお勧めします:キーはリスナー自体であり、ハンドラを評価します。本当に私はリスナーを弱めることができます。しかし、それはデータ構造をもう少し複雑にし、誰にもイベントをブロードキャストする時間が来たら、その構造にはもう一つのレベルがあります。
あなたはどう思いますか?
この質問はバック "メタ" を取得することができ、したがって、この
のようにそれにweakrefsを得ることができますそれは解決策に焦点を当てているだけでなく、「なぜ」ではないからです。ここで受け入れられる良い答えを聞かせてください。せいぜい、他の質問には、「これは他の質問への答えを意味する」という意味で重複するものとしてマークすることができます。 – kxr