Python.use(better, Tkinter=”GoF”) # Visitor #1

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

Visitor #1

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

概要

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

事例:コードの解説

■ Composite::Component
## ---------------------------------------- Composite::Component
class Component(object):

抽象クラス Component では、共通するプロトコルを規定します。

■ Visitor::Element
    ## ---------------------------------------- Visitor::Element
    def accept_(self, visitor, arg=0):
        eval("visitor.visit%s_(self, arg)"%self.__class__.__name__)

抽象メソッド accept_ は、共通するプロトコルを規定するもので、対象になるメソッド呼び出しが実行時に確定します。

  • インスタンスオブジェクトが属するクラスの名前 self.__class__.__name__ が、メソッドの名前の一部に組み込まれます。
■ Visitor::Visitor
## ---------------------------------------- Visitor::Visitor
class Visitor(object):
    def visitLeaf_(self, *args): pass
    def visitComposite_(self, *args): pass

抽象クラス Visitor では、共通するプロトコルを規定します。

  • メソッド visitLeaf_ では、末端に位置するノード(葉)に対する処理を規定します。
  • メソッド visitComposite_ では、中間に位置するノード(枝)に対する処理を規定します。
■ Visitor::ConcreteVisitor
## ---------------------------------------- Visitor::ConcreteVisitor
class ConcreteVisitor(Visitor):

具象クラス ConcreteVisitor では、子孫クラスに共通するプロトコルを規定します。

    def __init__(self, client):
        self.client = client

メソッド __init__ では、さまざまなインスタンス属性を初期設定します。

■ TreeVisitor
class TreeVisitor(ConcreteVisitor):

クラス TreeVisitor では、コンポーネントを使ってツリーを構成します。

    def visitLeaf_(self, node, indent):
        tab1 = "    "
        tab2 = "  . "
        self.client.append(
            master=self.client.widget,
            tab=tab1*indent+tab2,
            image=self.client.fileImage,
            node=node,
            )

メソッド visitLeaf_ では、末端に位置するノード(葉)に対する処理を規定します。

    def visitComposite_(self, node, indent):
        tab1 = "    "
        tab2 = "  - "
        self.client.append(
            master=self.client.widget,
            tab=tab1*indent+tab2,
            image=self.client.dirImage,
            node=node,
            )
        for e in node:
            e.accept_(TreeVisitor(self.client), indent+1)

メソッド visitComposite_ では、中間に位置するノード(枝)に対する処理を規定します。

  • node の傘下にある各ノード e(ディレクトリー/ファイル)を順にたどりながら、TreeVisitor のインスタンスを利用して、ツリーを構築します。
■ TextVisitor
class TextVisitor(ConcreteVisitor):

クラス TextVisitor では、文字列を使ってツリーを構成します。

    def visitLeaf_(self, node, indent):
        self.client.append(self._item(indent, ". ", node))

メソッド visitLeaf_ では、中間に位置するノード(枝)に対する処理を規定します。

    def visitComposite_(self, node, indent):
        self.client.append(self._item(indent, "- ", node))
        for e in node:
            e.accept_(TextVisitor(self.client), indent+1)

メソッド visitComposite_ では、中間に位置するノード(枝)に対する処理を規定します。

  • node の傘下にある各ノード e(ディレクトリー/ファイル)を順にたどりながら、TextVisitor のインスタンスを利用して、ツリーを構築します。
    def _item(self, indent, s, node):
        return "\n"+"| "*indent + s + node.item

TOP


関連記事

Last updated♪2009/11/03