メタプログラミング
メタプログラミング
代表的なメタプログラミングの例はLISPのマクロである。
メタプログラミングの他の例としてはC++における「テンプレートメタプログラミング」などが挙げられる。
Rubyによるメタプログラミング演習
メタプログラミング ― つまり、"コードを生成するコード"を書くこと
Pythonでのメタクラス・プログラミング
ほとんどの読者は、オブジェクト指向プログラミングの継承、カプセル化、多態性といった概念については、すでによくご存じのことと思います。
といっても、いろいろな親を祖先とする何かのクラスからオブジェクトを生成する 操作は、通常、「単にそういう」ものとして捉えられています。
オブジェクト生成のプロセスをカスタマイズできるようになると、いろいろな新しいプログラミング構文の記述が可能になったり、簡単になったりします。
メタクラスを利用すると、いろいろなタイプの「アスペクト指向プログラミング」が可能になり、たとえば、トレース機能、オブジェクトの永続性、例外の記録などなど、いろいろな機能を付加してクラスを拡張できるようになります。
Pythonのお勉強 Part11 >>345
Pythonのお勉強 Part11
345 :デフォルトの名無しさん :2006/08/15(火) 06:42:11
メタクラスおもろいな。できることをまとめると↓こんな感じ?
クラス A のメタクラスを M とする。
1) A を定義する直前に所定のコードを実行できる。
この目的には M.__new__() をオーバーライドすればよい。
クラス名を変えたり基底クラスを増やしたりメソッドを置換(ラップ)したりできる。
比較:
A.__new__ においてインスタンスの生成方法を変更できるのと同様に、
M.__new__ において A の生成方法(すなわち A の定義)を変更できる。
2) A を定義した直後に所定のコードを実行できる。
この目的には M.__init__() をオーバーライドすればよい。
比較:
A.__init__ において A (および A の下位クラス) のインスタンスをいじれるのと同様に、
M.__init__ において A (および A の下位クラス) をいじれる。
3) クラスメソッド(第1引数がインスタンスではなくクラスであるメソッド)を定義できる。
この目的には M に適当な名前のメソッド(例えば foo)を定義すればよい。
A.foo() として呼び出すと M.foo(A) が実行される。
比較:A のインスタンスを a とすると a.bar() と A.bar(a) は同義。
*** 要約 ***
クラスがインスタンスの生成方法や振舞いを規定するのと同様に、
メタクラスはクラスの生成方法や振舞いを規定する。


![明快入門SQL [林晴比古実用マスターシリーズ] (林晴比古実用マスターシリーズ)](http://ecx.images-amazon.com/images/I/41vIWLSNXvL._SL160_.jpg)





