《02》依存性:change&update(2)〈Python 3.0 版〉
《Previous| |Next》
Python à la carte《記事一覧》
《02》依存性:change&update(2)
関連記事
依存性を利用してモデルの動作を規定する
モデルの動作を規定するときに、依存性を利用すると便利です。
% python3.0 -i ValueHolder.py >>>
まず、サンプルファイル ValueHolder.py を読み込んで、その動作を「対話モード」で確認できるようにします。
>>> m = ValueHolder() >>> m <__main__.ValueHolder object at 0x106850> >>> m.changed() >>>
モデル(として、ValueHolder のインスタンス)m を生成します。このとき、メソッド changed を呼び出しても、なにも出力しません。まだ、モデルの動作を規定していないからです。そこで、
>>> m.compute(lambda e: print(e))
<__main__.BlockValue object at 0x106490>
メソッド compute を使って、モデルの動作を規定(すると同時に、BlockValue のインスタンス 0x106490 を生成)します。ここでは、モデル m の値 e を出力するだけです。すると、
>>> m.changed() None
メソッド changed を呼び出したときに、None を出力します。これは、ValueHolder() で引数を省略すると、モデルには、初期値 None が設定されるからです。そこで、
>>> m.value(3)
3
メソッド value を呼び出すと、モデル m の値が変化(changed)するとともに、更新(update)に必要な処理をします。すると、メソッド compute で指定した処理に伴って、モデル m の値 3 を出力します。つまり、value の実引数 3 が、compute で指定した lambda e: の仮引数に対応します。また、
>>> m.changed() 3
メソッド changed を呼び出すと(モデル m の値は変化せずに)更新に必要な処理だけをして、同じ値を出力します。
モデルの動作を「実行時に」追加する
更新に必要な処理は、いつでも追加できます。これは、モデルの動作を「実行時に」追加できることを意味します。
>>> m.compute(lambda e: print("value:",e)) <__main__.BlockValue object at 0x106d10>
メソッド compute を使って、新たな動作を規定(すると同時に、BlockValue のインスタンス 0x106d10 を生成)します。そこで、
>>> m.changed() 3 value: 3
メソッド changed を呼び出すと、古い形式でモデル m の値 3 を出力した後で、新たな形式で値 3 を出力します。つまり、任意のモデルに対して、新たな動作を「追加」できたのが分かります。モデルの変化に呼応するオブジェクト群の存在は、
[<__main__.BlockValue object at 0x106490>, <__main__.BlockValue object at 0x106d10>]インスタンス属性 .dependents の値を見ると、2つ BlockValue を保持しているのが分かります。>>> del m.dependents[0] >>> m.dependents [<__main__.BlockValue object at 0x106d10>]
del を使って一方の BlockValue を削除すると、古い処理(object at 0x106490)が無効になります。そこで、>>> m.changed() value: 3メソッド changed を呼び出すと、新たな形式だけで値 3 を出力します。さらに、>>> m.value(4) value: 4 >>> m.value("A") value: Aメソッド value を呼び出すごとに、モデル m の値が変化するとともに、その値を出力します。モデルの動作を「実行時に」変更する
更新に必要な処理は、いつでも変更できます。これは、モデルの動作を「実行時に」変更できることを意味します。>>> del m.dependents[0] >>> m.changed()del を使って既存の処理を無効にすると、メソッド changed を呼び出しても、なにも出力しません。そこで、>>> m.compute(lambda e: print("value:",repr(e))) <__main__.BlockValue object at 0x106bf0> >>> m.changed() value: 'A' >>> m.value("B") value: 'B'まず、メソッド compute を使って、新たな動作を規定(BlockValue のインスタンスを生成)します。次に、メソッド changed を呼び出すと、新たな形式で値(文字列 'A')を出力します。そして、メソッド value を呼び出すと、モデル m の値が変化するとともに、更新した値 'B' を出力します。Tips
Last updated♪09/03/17