From Evernote: |
もっと Python めたくらっす |
こんにちは。Python界のマニアック担当aodagです。
expert python読書会で、メタクラスの話題があったらしく、食いつかずにはいられない。
__metaclass__ に指定するのって、普通はtypeを継承するよね。
でも、別にtype継承じゃなくたって、ファクトリならなんでも使える。
実は、class構文は、func(name, bases, dct) を呼ぶだけの糖衣構文なんだ。
実際に単なる関数をメタクラスにしてclass定義で書いてみよう
>>> def dictish(name, bases, dct):
... return dict((key, value) for key, value in dct.iteritems() if not key.startswith('_'))
...
>>> class MyDict(object):
... __metaclass__ = dictish
... a = 1
... b = 2
...
>>> MyDict
{'a': 1, 'b': 2}
dictishは受け取ったdctから、名前が"_"で始まるもの以外を返すだけの関数だ。
__metaclass__にすると、dictishには、クラス定義の内容がわたってくる。
nameには、"MyDict"、baseには、"object"、そして、dctには、{"a":1, "b":2 ....} といったdictが渡される。
この関数の戻り値が、MyDictって変数に入るわけだね。
ということで、MyDictは、定義中の変数を含むdictになる。
ま、こんなことしてなんになるんだって疑問はあるだろうけど、このテクニックを使うとDSLを作るときのネタになるかもしれない。
勢いだけで書いた。反省はしていない。