2008年5月21日水曜日

C vs Python

別に宗教論争をしようというわけではありません。
単なるくだらない私見です。

「自分の得意な言語は何ですか?」と問われれば、
「C言語です」と間違いなく答えるでしょう。
一応、ユーザランドのスタンドアローン、デーモンプログラムも書けるし、
*BSD系のOSであれば、kernel を読めといわれてもなんとか読めるので。
で、そんな自分が最近 python を書いていて思うこと。

indent で式構造が制御されている、文末に";"をつけないなんて違いが
python にはありますが、ぶっちゃけそんなのは単なる記法の違いなので、
あんまりたいしたことではない。当然、ガベージコレクションや
try/except 型の例外処理なんかが実装されているという、cにはない長所もある。
(もちろん、両者を混同することは多々ありますが。。。)

ただ、どうしても未だになじめていない点が一つ。
オブジェクトの初期化(__init__())に失敗した場合にはどうしたらいいのだろうか?
当然、オブジェクトの初期化の際に、なんらかの処理をする可能性は十分にあり、
その処理過程で問題が発生する可能性がある。
今は、自分では、そういう問題が発生した場合には明示的に None を返して、
オブジェクトの初期化を呼び出した側では、返り値が None かどうかの検証を
しているわけですが、あんまり正しい気がしない。
なぜなら、正常に初期化できた場合には、特に返り値を設定することなく、
新しく生成されたオブジェクトのアドレス(参照?実体?)を取得することが
できるのに、失敗した場合に None を明示的に返さないといけないというのは納得いかない。
ガベージコレクションとの絡みもあるけど、Cプログラマとしては、一旦確保した領域は
必要なくなったときには明示的に解放しておかないと安心できない。特に、確保した領域が
無駄だということを知っている場合には。

失敗した場合には、明示的にデストラクタ(__del__())を呼べばいいのかな?とか思ったけど、
どうも以下のコードを実行する限りはうまくいかないようです。
うまくいかないとは、コンストラクタの中でデストラクタを呼んでも、
コンストラクタの返り値が None にはならないということ。
もう少し悩む。


1 class Child (Parent):
2 """ """
3 def __init__ (self):
4 """ """
5 self.__del__()
6 def __del__ (self):
7 """ """
8 def main():
9 child = Child()
10 print child
11
12 #-------------------------------------------------
13 if __name__ == "__main__":
14 main()


0 件のコメント: