Python.use(better) #list: step03 -- def __init__(self, sequence=None)

記事一覧 Python.use(better)《Python3.1》

def __init__(self, sequence=None)

《著》小粒ちゃん+∞《監修》小泉ひよ子とタマゴ倶楽部
第0版♪2001/03/02 ● 第1版♪2003/05/25 ● 第2版♪2004/06/01 ● 第3版♪2009/02/28

事例:モジュールを起動する

■ 全項目を確認する

全ステップの「項目」を確認するには、関数 do を利用します。

$ python -i myList.py
>>> do()
...
 3: step03 -- def __init__(self, sequence=None)
■ 各項目を実行する

各ステップの「動作」を確認するには、関数 do の実引数を指定します。

>>> do(3)
>>> # ---------------------------------------- __init__
>>> s = myList(); s

>>> s = myList("ABC"); s
['A', 'B', 'C']
>>> # ---------------------------------------- append
>>> s = myList(); s

>>> s.append('A'); s
['A']
>>> s.append('B'); s
['A', 'B']
>>> s.append('C'); s
['A', 'B', 'C']
>>>
  • クラス呼び出し myList() の実引数(シーケンス)に含まれる各要素を列挙した、新たなリスト s が得られます。

事例:コードの解説

def step03():
    """def __init__(self, sequence=None)"""

    class myList(object):
        def __init__(self, sequence=None):  #1:
            self.head = self.tail = Node()
            if sequence:
                for e in sequence:
                    self.append(e)

        def append(self, item):
            node = Node(item, self.tail.next)
            self.tail.next = node
            self.tail = node

        def __repr__(self):
            s = []
            node = self.head.next
            while node:
                s.append(repr(node.item))
                node = node.next
            return "[%s]"%", ".join(s)

    ## ----------------------------------------
    tips = "__init__", "append",                #2:
    for e in tips:
        print(">>> #","-"*40,e)
        eval("ex_%s(SPEC, local)"%e)

## ----------------------------------------
def ex___init__(spec, local):               #@:
    X = 's = %s(); s'%spec
    print_(X, local)
    X = 's = %s("ABC"); s'%spec
    print_(X, local)

def ex_append(spec, local):
    ...
■ #1: 初期設定
        def __init__(self, sequence=None):  #1:
            self.head = self.tail = Node()
            if sequence:
                for e in sequence:
                    self.append(e)

メソッド __init__ は、クラス呼び出し myList() に呼応して、生成したインスタンスを初期設定します。

  • 引数 sequence を指定すると、
    • sequence の各要素 e を、連結リスト self の末尾に追加 append します。
■ #2: テストケースの評価
    tips = "__init__", "append",                #2:
    for e in tips:
        print(">>> #","-"*40,e)
        eval("ex_%s(SPEC, local)"%e)

テストケースの名前はすべて "ex_" で始まります。そこで、

  • 組み込み関数 eval を利用して、実行時に確定するコードの断片を評価します。

すると、呼び出したい関数名は実行時に確定します。
例えば、for に続く制御変数 e の値が "append" のとき、

        eval("ex_%s(SPEC, local)"%e)
        eval("ex_append(SPEC, local)")
        ex_append(SPEC, local)

これらはどれも同じ結果になります。

》こちらに移動中です《
TOP


関連記事

Last updated♪2009/12/10