《22》要素数:メソッド __len__

記事一覧

Python.use(better, for=”Rookie") 実録:はじめてのプログラミング《Python3.0》
素数:メソッド __len__

《著》小粒ちゃん+α《監修》小泉ひよ子とタマゴ倶楽部
第3版♪2009/02/28 ● 2009年2月12日(木)

概要

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

組み込み型 list と同等の機能を実現することで、その理解を深めます。list を利用できる状況ならいつでも、これから作成するクラス myList で代用できることを目指します。
JPython1.1.x/Jython2.1.x 用に作成したセミナー課題を、Jython2.5 で再構成しました。



素数:メソッド __len__

組み込み型 list と同様に、連結リストの要素数が得られると便利です。すると、

def ex():
    s = myList()
    print(s,"\t#",s.__class__.__name__)
    print len(s)

    s = myList("ABC")
    print(s,"\t#",s.__class__.__name__)
    print len(s)

その動作(仕様)を確認すると、

>>> ex()
[] 	# myList
0
['A', 'B', 'C'] 	# myList
3

組み込み関数 len を使って、引数に指定した連結リストの要素数が得られます。


実現:メソッド __len__

メソッド list.__len__ に準拠したものを実現します。

class myList(object):
    ...
    def __len__(self):
        return reduce(lambda n,e: n+1, self, 0)

組み込み関数 len に呼応して、シーケンス内の要素数を得る手段を提供します。組み込み関数 reduce を利用すると、このように簡潔に表現できます。

《Note》情報隠蔽の原則:GoFIterator パターンを適用すると、self と記述するだけで、各要素 e を参照する手段(how)に依存しない抽象表現(what)ができます。

受講者への課題

for 文を利用すると、次のようになります。

    def __len__(self):
        n = 0
        for _ in self:
            n += 1
        return n

reduce 版と比較して、その長所/短所について考察してください。■

TIPS

TOP