[[どぶお/Pythonで遊ぼう!]]
 * メタプログラミング [#n26ff7fb]
 ** メタプログラミングって何だ? [#oc5f057e]
 正確に認識しているかどうか怪しいですが、「ソースコードの生成をプログラミングで実現する」と認識しています。~
 つまり、Pythonであればクラスを定義するには、
 * コード中でクラスを定義 [#n26ff7fb]
 ** 何をやりたいか? [#oc5f057e]
 Pythonであればクラスを定義するには、
  class MyClass(object):
      def __init__(self, value):
          self.value = value
  ...
 というようにしますが、プログラム実行中に上記のMyClassクラスを生成する、というものです。あくまで私の認識なので間違っているかもしれませんので、正確な意味は信頼できる文献等を調べて下さい⌣。~
 ともかく、このような手法のメモをしておきます。
 というようにしますが、プログラム実行中に上記のMyClassクラスを生成する、というものです。
 
 ** クラスを生成する [#g0a85c30]
 例えば、定義されているMyObjectをベースクラスにしたMyDirectoryというクラスを動的に生成してみます。
 組み込み関数の''type''を使います。
  newcls = type("MyDirectory", (MyObject,), {})
 これで変数clsにMyDirectoryというクラスが格納されます。Pythonドキュメントでは以下のように説明されています。
 > type('''name''', '''bases''', '''dict''')~
 新しい型オブジェクトを返します。本質的には class 文の動的な形です。~
 '''name''' 文字列はクラス名で、__name__属性になります。'''bases''' タプルは基底クラスの羅列で、__bases__ 属性になります。'''dict''' 辞書はクラス本体の定義を含む名前空間で、__dict__ 属性になります。たとえば、以下の二つの文は同じ type オブジェクトを作ります:
  >>> class X(object):
  ...     a = 1
  ...     
  >>> X = type('X', (object,), dict(a=1))
 '''バージョン 2.2 で 新たに追加 された仕様です。'''
 RIGHT:[['''Python 2.6.2 組み込み関数の3つの引数のtype()'''>http://www.python.jp/doc/nightly/library/functions.html#type]]
 
 ここで生成した'''newcls'''は通常のクラスのように使えるので、
  obj = newcls()
 でMyDirectoryオブジェクトが構築できます。