[[どぶお/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オブジェクトが構築できます。