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

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

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

主モデルから獲得した情報を無視する

従モデル(ビュー)が必要としない(適切でない)情報は、無視したい場合もあります。


>>> m = ValueHolder()

主となるモデル(として、ValueHolder のインスタンス)m を生成します。

>>> m3 = BlockValue(lambda self,e: print("{0}: {1!r}".format(self.name,("",hex(ord(e)))[e.isalnum()])),[m])
>>> m3.name = "isalnum"

従となるモデル(として、BlockValue のインスタンス)m1 を生成します。これは、主モデル m の変化に呼応して、その値 e に対応する文字コード ord(e) を出力します。ただし、その値 e が英数字 isalnum でないときには、なにも表示しません。また、従モデル m3 に固有のインスタンス属性として、.name には、それを識別するための文字列 "isalnum" を設定します。

>>> m.value("A")
isalnum: '0x41'

メソッド value を呼び出すと、主モデル m の値が変化したのに呼応して、従モデル isalnum が文字コードを16進数形式の文字列 '0x41' で出力します。

>>> m.value("@")
isalnum: ''

メソッド value を呼び出すと、主モデル m の値が変化したのに呼応して、従モデル isalnum が空の文字列 '' を出力します。これは、モデルから獲得した情報を無視したことになります。

主モデルから新たな情報を獲得する

従モデル(ビュー)が必要な情報を、主モデルから実行時に獲得できると便利です。


>>> m = ValueHolder()

主となるモデル(として、ValueHolder のインスタンス)m を生成します。

>>> m.name = "model"
>>> m.id = lambda: "<{0!r} 0x{1:x}>".format(m.name,id(m))

主モデル m に固有のインスタンス属性として、.name には、それを識別するための文字列 "model" を設定するとともに、.id には、モデルの識別情報を獲得する関数 lambda を設定します。この識別情報には、利用者が設定した m.name と、システムが提供する id(m) とが含まれます。

>>> m4 = BlockValue(lambda self,e: print(self.model.id(),"{0}: {1}".format(self.name,ord(e))),[m])

従となるモデル(として、BlockValue のインスタンス)m4 を生成します。これは、主モデル m の変化に呼応して、その値 e に対応する文字コード ord(e) だけでなく、主モデル self.model から得た識別情報 id() を出力します。

>>> m4.name = "ord"
>>> m4.model = m

従モデル m4 に固有のインスタンス属性として、.name には、それを識別するための文字列 "ord" を設定するとともに、.model には、主モデル m を設定します。すると、属性 .model を介して、主モデルの情報を獲得できます。

>>> m.value("A")
<'model' 0x626970> ord: 65
>>> m
<__main__.ValueHolder object at 0x626970>

メソッド value を呼び出すと、主モデル m の値が変化したのに呼応して、従モデル ord が文字コード 65 を出力するとともに、主モデルから獲得した識別情報を出力します。これには、利用者が設定した 'model' と、システムが提供する 0x626970 とが含まれます。これは、オブジェクトの文字列表現に含まれる情報 0x626970 と同じものです。

Tips

ビューにとって、モデルの好ましい変化だけを受け入れて、そのときだけ対処したり、必要ならモデルから補足情報を新たに獲得するという戦略も考えられます。

Last updated♪09/03/21