はじめてのIronPythonその2
引き続き、IronPythonで遊ぶ。
class HelloPython : def greet(self): print "Hello, I'm Python." if __name__ == "__main__": hello = HelloPython() hello.greet()
こんなソースをこさえてhello.pyとか名前付けて保存し、
> IronPythonConsole hello.py
コンパイル(?)すると、__main__.exeというモジュールが作られます。現状ではこの名前でしか出力出来ないみたいです。さて、このモジュールはILバイトコードとしてコンパイルされていますが、どのような型が生成されているのでしょうか。ちょっとReflectorを使ってアウトラインを見てみます。
public class __main__ : module { // Methods public __main__(); public static object greet$f0(object self); public static IDictionary HelloPython$maker0(); public override void init(); public static void Main(); // Fields public static object _; public static object __name__; public static object hello; public static object HelloPython; public static __main__ myModule__py; }
てっきり、HelloPythonというクラスが作られているものと思っていましたが、実はPythonのモジュール(__main__)がクラスとなっています。しかもローカル変数で作ったHelloPythonのインスタンスであるhelloが静的なメンバ変数になっています。あれれ?ま、まさか、
hello1 = HelloPython() hello2 = HelloPython() hello1.greet() hello2.greet()
こんなコトすると・・・
public class __main__ : module { // Methods public __main__(); public static object greet$f0(object self); public static IDictionary HelloPython$maker0(); public override void init(); public static void Main(); // Fields public static object _; public static object __name__; public static object hello1; public static object hello2; public static object HelloPython; public static __main__ myModule__py; }
やっぱし!(^^; なんか、かなり勝手が違う模様。言語間での継承とか出来ないのかしら・・・もうちょい弄ってみる必要がありそ。