を破壊しましたオブザーバー:は、[する必要があります]私はPythonでオブザーバー-observableパターンを実装しています
class Observer(object):
def __init__(self, foo):
self.foo = foo
self.foo.addObserver(self)
def __del__(self):
print('Observer.__del__ called')
self.foo.removeObserver(self)
def valueChanged(self, old, new):
print('foo changed from %s to %s' % (old, new))
コードは期待通りに機能します。
しかし、私はObserver
を破壊する必要があります(参照されていない場合は、Observable
オブジェクト内のオブザーバーのリストから自身を削除する必要があります)。
Observer
がObservable
オブジェクトのオブザーバーのリストにある場合、このコードではObserver.__del__
が呼び出されないという問題があります。私は必ずしも明示的Observer
を破壊しない
注意、それはまた、これ実行可能でない破壊に明示的に前removeObserver()
を呼び出し、理由変数の代入を参照されない移動します。
私がself.foo.addObserver(self)
をコメントアウトした場合、Observer
への追加の参照はなく、del
を呼び出すとObserver.__del__
が呼び出されます。
このシナリオのテストケースがある:self.foo.addObserver(self)
がコメントアウトされていない場合self.foo.addObserver(self)
がコメントアウトされている場合、それは、foo changed from 23 to 44
とfoo changed from 44 to 1
- :
foo = Observable(23) bar = Observer(foo) foo.set(44) bar = None foo.set(1)
それは2つの結果を持っていますそれは印刷する
Observer.__del__ called
弱点を見ましたか?弱い参照はこの問題を正確に解決するように設計されており、2.4以降のPythonの機能となっています。 –