《21》コンストラクター:メソッド __init__《Python3.0》

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


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

■ 概要

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

組み込み型 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