ikeike443のブログ

ソフトウェアビジネスに関心がある系のブログ

Python クロージャの使い方が分からない。。

オブジェクトはデータに振る舞いが付いたもの
クロージャは関数にデータがついたもの
とどこかで聞いたので、クラスを使わず、クロージャと関数ポインタを使って、OOPっぽい実装をしてみた。

あ、Python2.5.2です。Python3000だとレキシカル変数に触れるようになるのでまた書き方が変わると思います。(http://blog.livedoor.jp/kikwai/archives/51543288.html)

ともあれ。

def closuretst():
    a=[0]
    b=[0]
    def geta(x):
        a[0]+=x
        return a[0]
    def getb(x):
        b[0]+=x
        return b[0]
    dispatch = {"geta": geta,"getb": getb}
    return dispatch

obj_a = closuretst()
obj_b = closuretst()

print obj_a["geta"](1)
print obj_a["geta"](1)
print obj_a["geta"](1)

print obj_a["getb"](3)
print obj_a["getb"](3)
print obj_a["getb"](3)

print obj_b["geta"](1)
print obj_b["geta"](1)
print obj_b["geta"](1)

print obj_b["getb"](3)
print obj_b["getb"](3)
print obj_b["getb"](3)

実行結果はこんな感じ↓

>>> 
1
2
3
3
6
9
1
2
3
3
6
9

カプセル化は出来てる。だからなんだ。

アキュムレータなんだから、getaじゃなくてaccumaっていう名前の方がよかったな。。