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

Python à la carte記事一覧
《04》依存性:change&update(4)

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

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

ここでは、同じ情報をもとに、それぞれが異なる形式で表示したい…という状況を想定しています。このとき、モデルは、その変化に呼応するオブジェクト群(ビュー)に固有の問題解決を、気に掛ける必要はありません。モデルが提供する情報を使ってどのように問題を解決するか、各ビューが自分で決定できます(分割統治)。

Last updated♪09/03/20