Java.use(better); Episode#01 拡張可能な for 文(1)
□ Jython の場合
for..in 文の対象に、特殊メソッド __iter__ を規定しないものを指定すると、
for e in File("bin/apple/lang"): TypeError: 'java.io.File' object is not iterable
実行時にエラーとなります。そこで、特殊メソッド __iter__ を再定義して、
for e in ExFile("bin/apple/lang"): print e
for..in 文を利用すると、次の結果が得られます。
$ jython _Tips.py _Tips.class App.class ExFile.class ExTokenizer$1.class ExTokenizer.class $
これは、次のように実現します。
class ExFile:
def __init__(self, pathname):
self.seq = File(pathname).list()
def __iter__(self):
for e in self.seq: yield e
特殊メソッド __iter__ を再定義して、各要素を巡回できるようにします。
これで、ポリモフィズムを実践する準備が整いました。
for seq in [ ["AB","C","DEF"], StringTokenizer("This is a pen."), ExFile("bin/apple/pie"), ]: print ">>> %s"%seq.__class__.__name__ for e in seq: print e
このとき、__iter__ を規定した任意の seq に対して、for..in 文の本体にあるコードの断片は有効です。つまり、for..in 文は「ポリモフィズム」を体現しています。
前述したものを実行すると、次の結果が得られます。
$ jython _Tips.py >>> list AB C DEF >>> StringTokenizer This is a pen. >>> ExFile _Tips.class App.class ExFile.class ExTokenizer$1.class ExTokenizer.class $
《付記》Jython では、StringTokenizer についても、
from java.util import StringTokenizer
とするだけで、for..in 文と組み合わせて利用できます。≡
↑ TOP
update*13/01/04 21:13:19