Python.use(better)

前の記事記事一覧次の記事
Python.use(better)


実録:はじめてのプログラミング《19》

■ 概要

デザインパターンを学習するための題材として、連結リストを作成します。

組み込み型 list と同等の機能を実現することで、その理解を深めます。list を利用できる状況ならいつでも、これから作成するクラス myList で代用できることを目指します。

《Note》JPython1.1.x/Jython2.1.x 用に作成したセミナー課題を、Jython2.5 で再構成しました。

連結リスト課題

def ex():
    s = list()          ; print(s,"\t#",s.__class__.__name__)
    for e in "ABC":
        s.append(e)     ; print(s)

>>> ex()
[] 	# list
['A']
['A', 'B']
['A', 'B', 'C']

組み込み型 list は、任意の要素からなるシーケンス(リスト)を扱うのに便利な機能を提供します。メソッド append は、指定した要素をリストの末尾に追加します。

def ex():
    s = myList()        ; print(s,"\t#",s.__class__.__name__)
    for e in "ABC":
        s.append(e)     ; print(s)

>>> ex()
[] 	# myList
['A']
['A', 'B']
['A', 'B', 'C']
>>> myList("ABC")
['A', 'B', 'C']

この課題で作成するクラス myList は、連結リストの概念を実現したもので、組み込み型 list に準拠します。仕様を確認したので、これから、課題が完成するまでの過程を追跡します。

コードの解説

class myList(object):

クラス myList は、連結リストを実現したものです。

    def __init__(self):
        self.head = self.tail = Node()

メソッド __init__ は、クラス呼び出し myList() に呼応して、生成したばかりのインスタンスを初期設定します。属性 .head が先頭のノードを、属性 .tail が末尾のノードを参照するとともに、各ノード(要素)を保持します。

    def append(self, item):
        node = Node(item, self.tail.next)
        self.tail.next = node
        self.tail = node
    def __str__(self):          # ver.1
        s = []
        node = self.head.next
        while node:
            s.append(repr(node.item))
            node = node.next
        return "[{0}]".format(", ".join(s))

メソッド __str__ は、組み込み関数 str に呼応します。組み込み型 list に準拠させるために、repr を利用します。組み込み関数 repr を利用すると、オブジェクトに固有の文字列表現が得られます。

class Node(object):
    def __init__(self, item=None, next=None):
        self.item = item
        self.next = next

クラス Node は、連結リストを構成する各ノードを実現したものです。属性 .item が各項目(要素)を保持するとともに、属性 .next を介して次のノードを参照します。

Tips

組み込み型 list に準拠するクラスを作成する過程を通して、list に関する理解を深めるとともに、プログラムだけではなく、プログラミングに関する理解を深めます。それによって、プロダクト指向から「プロセス指向」への扉を開きます。
TOP


Last updated♪2009/10/05