はじめての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;
}

やっぱし!(^^; なんか、かなり勝手が違う模様。言語間での継承とか出来ないのかしら・・・もうちょい弄ってみる必要がありそ。