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)