Python.use(better) #list: step04 -- def __len__(self)

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

def __len__(self)

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

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

■ 全項目を確認する

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

$ python -i myList.py
>>> do()
...
 4: step04 -- def __len__(self)
■ 各項目を実行する

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

>>> do(4)
...
>>> # ---------------------------------------- __len__
>>> s = myList(); s; len(s)
[]
0
>>> s.append('A'); s; len(s)
['A']
1
>>> s.append('B'); s; len(s)
['A', 'B']
2
>>> s.append('C'); s; len(s)
['A', 'B', 'C']
3
>>>
  • リスト s に要素を追加するたびに、その要素数が1つずつ増えます。

特殊メソッド __len__

メソッド __len__ は、組み込み関数 len に呼応して、要素数を与えます。

>>> class myList(object): pass

>>> x = myList(); x
<__main__.myList object at 0x124ddd0>
>>> len(x)
...
TypeError: object of type 'myList' has no len()

このメソッドを定義せずに len を適用すると、例外 TypeError を生成します。

事例:コードの解説

def step04():
    """def __len__(self)"""

    class myList(object):
        def __len__(self):                      #1:
            n = 0
            node = self.head.next
            while node:
                n += 1
                node = node.next
            return n

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

## ----------------------------------------
def ex___len__(spec, local):
    X = 's = %s(); s, len(s)'%spec
    print_(X, local)
    for e in "ABC":
        X = 's.append({0!r}); s, len(s)'.format(e)
        print_(X, local)
■ #1: リストの長さ(要素数
        def __len__(self):                      #1:
            n = 0
            node = self.head.next
            while node:
                n += 1
                node = node.next
            return n

メソッド __len__ は、組み込み関数 len に呼応して、リストの長さ(要素数)を与えます。

  • 局所変数 n は、要素数を保持します。
  • 先頭のノード self.head から各要素を順にたどりながら、変数 n の値を1つずつ増やします。

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


関連記事

Last updated♪2009/10/07