Python.use(better, Tkinter=”GoF”) # Iterator #2

記事一覧 Python.use(better)《Python3.1》

Iterator #2

《著》森こねこ・小粒ちゃん+∞《監修》小泉ひよ子とタマゴ倶楽部
α版♪1993/11/25 ● β版♪1995/11/22 ● 第1版♪2003/05/23

概要

Tkinter/Python によるオブジェクト指向プログラミングへの扉を開きます。
※ Tcl/Tk で作成した例題を、Tkinter で再構成しました。

事例:コードの解説

■ Composite::Composite:複合オブジェクト
## ---------------------------------------- Composite::Composite
class Composite(Component):

具象クラス Composite では、複数のノードによって構成され、中間に位置する各ノード(枝)を実現します。

    ## ---------------------------------------- Iterator::Iterator
    def __iter__(self):
        for e in self.children:
            yield e

メソッド __iter__ は、組み込み関数 iter に呼応して、各ノードを参照する方法を規定します。

  • Composite は、その傘下にある各ノード self.children が保持する項目 e をリターン値にします。

《TIPS》メソッド __iter__ を定義すると、self と記述するだけで、それを実現する方法(how)に依存しない、抽象表現(what)が可能になります。

    def __repr__(self):
        return "%s(#%s: [%s])"%(
            self.__class__.__name__,
            self.item,
            ",".join([str(e) for e in self]),
            )

メソッド __repr__ では、__iter__ を規定してあるので、その傘下にある複数のノードを参照したいときには、self と記述するだけで十分です。

    def __str__(self):
        return "\n".join([self.item]+[str(e) for e in self])

メソッド __str__ は、組み込み関数 str に呼応して、オブジェクトに固有の文字列表現を規定します。

    ## ----------------------------------------
    def nodes(self):
        return reduce(lambda s,e: s+e.nodes(),
            self, [self.item])

メソッド nodes では、各ノードが保持する項目 self.item を列挙したリストをリターン値にします。

    def indents(self, level=0):
        return reduce(lambda s,e: s+e.indents(level+1),
            self, [level])

メソッド indents では、各ノードの階層 level を列挙したリストをリターン値にします。

    def dirs(self):
        return reduce(lambda s,e: s+e.dirs(),
            self, [True])

メソッド dirs では、ディレクトリーであることを表わす True を要素とするリストをリターン値にします。

TOP