《04》依存性:change&update(4)〈Python 3.0 版〉
Python à la carte《記事一覧》
《04》依存性:change&update(4)
関連記事
BlockValue(改訂版)
class BlockValue(ValueModel): def update(self): value = self.closure(self,*[e._value for e in self.args]) self.value(value)
(前述した)メソッド update を改訂して、BlockValue 自身 self を参照できるようにします。すると、他のモデル(主)に呼応するモデル(従)のインスタンス属性などを、引数 self を介して参照できるようになります。
主モデルの変化に呼応する1つの従モデル
>>> m = ValueHolder()
主となるモデル(として、ValueHolder のインスタンス)m を生成します。
>>> m1 = BlockValue(lambda self,e: print("{0}: {1}".format(self.name,ord(e))),[m])
従となるモデル(として、BlockValue のインスタンス)m1 を生成します。これは、主モデル m の変化に呼応して、その値 e に対応する文字コード ord(e) を出力します。
>>> m1.name = "ord"
インスタンス属性 .name には、従モデル m1 を識別するための文字列 "ord" を設定します。すると、主モデルの状態が変化したときに、どの従モデルが呼応するかを識別できます。そこで、
>>> m.value("A") ord: 65
メソッド value を呼び出すと、主モデル m の値が変化したのに呼応して、従モデル ord が文字コード 65 を出力します。つまり、value の実引数 "A" が、BlockValue で指定した lambda 式の仮引数 e に対応します。また、従モデル m1 は、BlockValue で指定した lambda 式の仮引数 self に対応します。
主モデルの変化に呼応する2つの従モデル
>>> m2 = BlockValue(lambda self,e: print("{0}: {1!r}".format(self.name,hex(ord(e)))),[m])
従となるモデル(として、BlockValue のインスタンス)m2 を生成します。これは、主モデル m の変化に呼応して、その値 e に対応する文字コードを16進数形式 hex(ord(e)) で出力します。
>>> m2.name = "hex"
同様に、インスタンス属性 .name には、従モデル m2 を識別するための文字列 "hex" を設定します。そこで、
>>> m.value("B") ord: 66 hex: '0x42'
メソッド value を呼び出すと、主モデル m の値が変化したのに呼応して、従モデル ord の出力に続いて、従モデル hex が文字コードを16進数形式の文字列 '0x42' で出力します。つまり、value の実引数 "B" が、BlockValue で指定した lambda 式の仮引数 e に対応します。また、従モデル m2 は、BlockValue で指定した lambda 式の仮引数 self に対応します。
主モデル(自分)の変化に呼応する
>>> m.name = "model"
同様に、インスタンス属性 .name には、主モデル m を識別するための文字列 "model" を設定します。さらに、
>>> m.compute(lambda self,e: print("{0}: {1!r}".format(m.name,e)))
<__main__.BlockValue object at 0x601dd0>
メソッド compute を使って、主モデルの動作を規定(すると同時に、BlockValue のインスタンス 0x601dd0 を生成)します。ここでは、モデル m の値 e を出力するとともに、そのインスタンス属性 .name の値を出力します。これは、モデルを識別するための便宜的なものです。そこで、
>>> m.value("C") ord: 67 hex: '0x43' model: 'C'
メソッド value を呼び出すと、主モデル m の値が変化したのに呼応して、従モデル ord/hex の出力に続いて、主モデル model が自分の値 'C' を出力します。つまり、value の実引数 "C" が、compute で指定した lambda 式の仮引数 e に対応します。
Tips
ここでは、同じ情報をもとに、それぞれが異なる形式で表示したい…という状況を想定しています。このとき、モデルは、その変化に呼応するオブジェクト群(ビュー)に固有の問題解決を、気に掛ける必要はありません。モデルが提供する情報を使ってどのように問題を解決するか、各ビューが自分で決定できます(分割統治)。