《21》コンストラクター:メソッド __init__《Python3.0》
■ 概要
デザインパターンを学習するための題材として、連結リストを作成します。
組み込み型 list と同等の機能を実現することで、その理解を深めます。list を利用できる状況ならいつでも、これから作成するクラス myList で代用できることを目指します。
《Note》JPython1.1.x/Jython2.1.x 用に作成したセミナー課題を、Jython2.5 で再構成しました。
コンストラクター:メソッド __init__〈第3版〉
メソッド append を利用して、各要素をひとつずつ追加していたのでは面倒です。そこで、
def ex___iter__():
X = 's = myList(); s; len(s)'
print(">>>",X)
eval(compile(X,"","single"))
X = 'for e in "ABC": s.append(e)'
print(">>>",X)
eval(compile(X,"","exec"))
X = 's; len(s)'
print(">>>",X)
eval(compile(X,"","single"))
X = 's = myList("ABC"); s; len(s)'
print(">>>",X)
eval(compile(X,"","single"))
X = '[e for e in myList("DEF")]'
print(">>>",X)
print(eval(X))
X = 'dict((e,ord(e)) for e in myList("ABC"))'
print(">>>",X)
print(eval(X))
X = 'reduce(lambda s,e: e+s, myList("ABC"), "")'
print(">>>",X)
print(eval(X))
% python3.0 -i linkedList.py >>> ex___iter__() >>> s = myList(); s; len(s) [] 0 >>> for e in "ABC": s.append(e) >>> s; len(s) ['A', 'B', 'C'] 3 >>> s = myList("ABC"); s; len(s) ['A', 'B', 'C'] 3 >>> [e for e in myList("DEF")] # 内包 ['D', 'E', 'F'] >>> dict((e,ord(e)) for e in myList("ABC")) # ジェネーター式 {'A': 65, 'C': 67, 'B': 66} >>> reduce(lambda s,e: e+s, myList("ABC"), "") CBA
組み込み型 list と同様に(インスタンスを生成するときに)複数の要素をまとめて指定できると便利です。すると、クラス myList を、内包やジェネーター式などと併用できます。
コードの解説
class myList(object): def __init__(self, sequence=[]): # ver.2 self.head = self.tail = Node() for e in sequence: self.append(e)
メソッド __init__ には、引数 sequence を指定できます。
引数を省略すると、空リスト [] を指定したものと見なされます。すると(for ブロックの本体を実行しないので)属性 .head/.tail は、初期設定 Node() のまま変化しません。そのため、空の連結リストが得られます。
引数を指定すると(for ブロックの本体を実行するので)連結リスト self に各要素 e を追加 append します。
Last updated♪09/03/17