《02》依存性:change&update(2)〈Python 3.0 版〉

Previous| |Next
Python à la carte記事一覧
《02》依存性:change&update(2)

《著》小粒ちゃん《監修》小泉ひよ子とタマゴ倶楽部
第3版♪2009/02/28

依存性を利用してモデルの動作を規定する

モデルの動作を規定するときに、依存性を利用すると便利です。

% 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