Python.use(better)
■ 概要
デザインパターンを学習するための題材として、連結リストを作成します。
組み込み型 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