Pythonでのクロージャは?
Perl のクロージャを読んでちょっと気になったので。
Pythonの場合、簡単な例でいくと
def func1(args): x = args def func2(y): return y+' :closureValue='+x return func2 a = func1('test') print a(' closure') a = func1('abc') print a(' closure') a = func1('efg') print a(' closure')
実行結果は以下
closure :closureValue=test closure :closureValue=abc closure :closureValue=efg
※でも古いPythonだと動きませんね・・・。
うーん、クロージャを使う利点としては
- immutable化
- 関数テンプレート化
が大きいかなあと思います。
Pythonの場合だと完全なカプセル化はできないので"immutable化"できるのは良いと思います。
(パッと見の話。きっと完全ではないんだろうけど)
例えばフレームワークを開発する側と使用する側がいた場合、開発する側がAPIを提供する際に意図しない動きをしないよう、クロージャを使用するってパターンがあるかも知れないですね。
(まあそれだけのために使うのもなんですが)
逆に使用する側は関数テンプレートとして使用するのはそこそこ重宝しそうです。
(ここでの使用する側は一般開発者、ドメインロジック作成側に近い)
使用用途はやはりコールバック関数が多いでしょうね。
似たようなパターンが出てきた場合、関数テンプレート化でリファクタリングできるケースも考えられるかもしれません。
Javaだとバカバカとクラス作ってやらなきゃいかんし正直めんどい気がするなあ。
(設計次第だけども)
で私的にですが結局、クロージャって
関数をファクトリーパターン、ビルダーパターンで作る
てことに集約されるのかなと。
関数の作成方法はファクトリー、あるいはビルダーのみが知ってると。
で属性は見えないように保持されてますよと。
(できた関数(返された関数)はストラテジー的に扱うのが一般的パターンかなあ)
ちなみにJythonでは上記文法はエラーです。
回避方法は多分あるんだけど、次回まで待て!
うくく。
追記
Javaではどうなるのさ?って話ですがやっておられる方がいました。
http://www.programmers-paradise.com/tdiary/?date=20060104
更に追記
昔ってこんな感じで書いていたんだっけ?
えー?こんなダサくないよなあ・・・・。うーん。
これならJythonでも動くけど。エレガントじゃないな、やっぱ。
def func1(args): x = args def func2(y,x=x): return y+' :closureValue='+x return func2 a = func1('test') print a(' closure') a = func1('abc') print a(' closure') a = func1('efg') print a(' closure')
ぬ、個人情報保護関連で思い出したこと
ふむ、S2にはSecurityプロダクトがないのか・・・。
Acegi Securityみたいなものがあれば良いのに。
更に+αで監視するオブジェクトを指定できれば尚よし。
(顧客データのアクセスをログに残すなど。PマークとかISMSとかだとこの辺要るんだよねえ・・・)
単純にロギングだからこれはあくまで+αだけどね。
うくく。
逆転の発想で
ちょっと面白そうだったので紹介。
http://www.boddie.org.uk/python/javaclass.html
http://sourceforge.net/project/showfiles.php?group_id=41175
http://paida.sourceforge.net/index.html
うーん、javaclassは必要性があるのかわからん。
snakeletsはPython版Tomcatって感じか。
PAIDAは素敵そう。JavaでもPythonでも使えるのがよい。
うくく。
思えば最近触ってないね
私の場合「オブジェクト指向プログラミングを学ぶ上で良い教材をあげろ」と言われれば以下を挙げます。
http://www.cycling74.com/products/maxmsp.html
かなりハマります。
うくく。
勉強ネタ
ありがたいのでのっけておこう
Pythonのお勉強
http://pleac.sourceforge.net/pleac_python/index.html
Wiki contents
うくく。