21章クラスメタプログラミング

(メタクラスは)99%のユーザが気にする必要がない以上にずっと奥深い魔法です。必要があるのかと思い悩んだことがあったとしても、必要はありません(本当に必要とするのは、必要であると確信を持っていて、その理由に説明を要しない人たちです)。

——Tim Peterstimsortアルゴリズムの発明者でありPythonの開発者comp.lang.pythonに投稿された「Acrimony in c.l.p.」と題されたメッセージより[21-01]†1

[†1] これは本書のまえがきで引用した2002年12月23日のメッセージと同じものですが、別の箇所を引用しています。TimBotはこの日に生まれました(TimBotについては2章末尾のSoapbox参照)。

クラスメタプログラミングは、ランタイムにクラスを作成したりカスタマイズしたりする技術です。Pythonではクラスは第1級オブジェクトなので、classキーワードを使わなくとも、いつでも関数から新しいクラスを作成できます。クラスデコレータも関数ですが、インスペクションや変更ができ、装飾されたクラスを別のクラスに置き換えることまでできます。最後に、メタクラス(metaclass)はクラスメタプログラミングのための最も先進的なツールで、すでに説明済みの抽象基底クラスのような、特殊な性質を持つまったく新しいカテゴリのクラスを作成できます。

メタクラスは強力ですが、正しく使うのは難しいです。クラスデコレータの方が、同型の問題をたいていはより簡単に解決できます。実際のところ、Python 2.6でクラスデコレータが導入されて以降、実用的なコードでメタクラスを利用することを正当化するのがとても難しくなったため、私が気に入っていたやる気の出る例題からも魅力がなくなってしまいました。 ...

Get Fluent Python ―Pythonicな思考とコーディング手法 now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.