- 2008-06-15 (Sun) 13:15
- Python
最近、諸事情で参加できないことが続いていたので、この第7回でなんとか巻き返しを図った。 結果、何とかP307まで読むことができ追いつけた。 が、内容はどの程度頭に残っているのだろう? 文法的な内容は置いておくとして、自分なりに感じた感想を。
Pythonは全てオブジェクトである
どうも最近のバージョンからなのだと思うが、関数・モジュール・変数・クラス、それら全てがオブジェクトとして一意に扱うことができるように作られている。 JavaScriptと似たような感じなのだろうか?JavaScript詳しくないからわかんないけど。
例えば全てのオブジェクトは自分自身を削除する関数(__del__関数)を内部的に持っている。
そこでやっとわかったことがある。以前にも書いたが、どうしてdel関数が組み込み関数になっているのか。
よくあるパターンではリストの2番目の要素を削除するときは以下のように書くだろう。
list.del(2)
だが、Pythonの場合はこう書く。
del(list(2))
これに非常に違和感があったのだが、Pythonの思想上オブジェクトを全て一意に扱うことから、内部的に全てのオブジェクトは自分自身を削除する機能を持たせることにした。 つまりリストが自分の持つ要素を削除するのではなく、その要素自身が自分を削除するわけだ。 つまり、内部的にはこのようなことが起きている。
list(2).del()
これがあまり直観的ではないから別途組み込み関数にdelを用意したのではないだろうか。 多分そのはずだ。きっと。いや、でも間違ってるかも。まあいいか。
シンプルさを保つために意外に無理やり
Pythonでは外部から関数へのアクセスを制限するために、アンダースコア(_)を前後に2つずつつける。
先ほどの__del__関数もその一つであり、外部からその関数にアクセスすることはできなくなる。
しかし、その実装方法に驚いた。
内部的に別の名前の関数に変換される
というのだ。
つまり__del__関数は内部でhogehoge_delなどのように全く違う名前の関数になっている。
だから外部から__del__で実行しようとしてもそんな関数はないから実行できない。
でもそれって、偶然その変換後の名前を探し当てたら実行できちゃうってことなの? まあ実際にはもっと探し当てにくい複雑な名前にしているのだとは思うし、当たったところで実行はできないのかもしれないけど、なんか無理やりだなぁと思った。
でもしかし、気持ちはわかる。 その変換後の名前を探してやろうなんて奴はめったにいないだろうし、そんなことをするメリットもよくわからない。 それなら、そんな機能を実装するのに一苦労するよりも現実的な解としては最適かもしれないからだ。 なんとなくRuby on Railsなんかの思想にも通ずるところがあると思う。
哲学を貫くJava、名より実を取るPython、いいとこどりのRuby、そんな感じだろうか。
(最近Javaの哲学はかなり揺らいでるとは思うけど。。)
関連するエントリー [Python] 「みんなでPython」 読書会#7
- Older: [Python]「みんなでPython」読書会#2
トラックバック:No Trackbacks
- トラックバック URL
- http://blog.garden-place.jp/action.php?action=plugin&name=TrackBack&tb_id=148
- Listed below are links to weblogs that reference
- [Python]「みんなでPython」読書会#7 from Web 酒 肴