Python 弾丸ツアー #DP: ツリー ... step 1: Composite::Leaf:単体オブジェクト

OOPデザインパターンリファクタリング

Python.use(better); Python 弾丸ツアー #DP: Tkinter/Python
>>> ツリー(階層構造)
step 1: Composite::Leaf:単体オブジェクト
《Python3.1|Jython2.5|IronPython2.6》

《著》小粒ちゃん@湘南組《監修》小泉ひよ子とタマゴ倶楽部
第0版♪2001/03/02 ● 第1版♪2003/05/23 ● 第4版♪2010/03/08

step 1: Composite を導入する

■ Composite::Leaf:単体オブジェクト
## ---------------------------------------- Composite::Leaf
class Leaf(Component):
    def __repr__(self):
        return "#%r"%self.item

 ̄具象クラス Leaf では、単一のノードを構成して、末端に位置する各ノード(葉)を実現します。ここでは、フォルダーに含まれる各ファイルが、Leaf に相当します。

    def __repr__(self):
        return "#%r"%self.item

 ̄メソッド __repr__ は、組み込み関数 repr に呼応して、オブジェクトに固有の文字列表現を規定します。ここでは、# に続いて、各項目 self.item の情報を提示します。すると、各ファイルを、すぐに確認できるようになります。たとえば、

    #'__init__.py'

という文字列表現になります。□


《Point》特殊メソッド __repr__ で規定される文字列表現は、ツリーの階層構造を反映しています。たとえば、Doc/HelpIndexingTool/__init__.py というパスに着目すると、次のように、



括弧 [...] 内に各要素(フォルダーまたはファイル)を列挙した、入れ子構造になっているのが分かります。□

■ Composite::Composite:複合オブジェクト
## ---------------------------------------- Composite::Composite
class Composite(Component):
    def __init__(self, item):
        super().__init__(item)
        self.children = []

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

    def add_(self, component):
        self.children.append(component)

 ̄具象クラス Composite では、複数のノードによって構成され、中間に位置する各ノード(節)を実現します。ここでは、複数のファイルを含むフォルダーが、Composite に相当します。

    def __init__(self, item):
        super().__init__(item)
        self.children = []

 ̄メソッド __init__ では、その傘下にある複数のノードを管理する self.children を初期設定します。ここでは、親クラス super での設定に続けて、その傘下 self.children に空のフォルダーを用意します。

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

 ̄メソッド __repr__ は、組み込み関数 repr に呼応して、オブジェクトに固有の文字列表現を規定します。ここでは、インスタンスが属するクラスの名前に続いて、その傘下 self.children にある複数のノードが保持する項目 e を、カンマ「,」で区切りながら列挙します。すると、各フォルダーに含まれるファイル群を、すぐに確認できるようになります。たとえば、

    Composite(#HelpIndexingTool: [...])

という文字列表現になります。

    def add_(self, component):
        self.children.append(component)

 ̄メソッド add_ は、その傘下 self.children に、指定されたノード component を追加します。ここでは、フォルダーの中に、任意のファイルやフォルダーを含めます。□

TOP
》作業中です《