Pythonの__metaclass__を少し理解したよ。
Pythonクックブックのオブジェクト指向プログラミングを読んでて、 下の2つは等価だと知った。(今更か?)
example1:
class Someclass(Somebase):
__metaclass__ = type
x = 23
example2:
Someclass = type('Someclass', (Somebase,), {'x': 23})
って事は、 example2 の方でも type.__new__ がコールされてるって事なのかな? ちょっと試しにやってみる。
>>> class HogeMetaclass(type):
... def __new__(cls, name, bases, attrs):
... """
... printするだけの拡張
... """
... print "__new__ has been called."
... return super(HogeMetaclass, cls).__new__(cls, name, bases, attrs)
...
>>> Hoge = HogeMetaclass('Hoge', (object,), {})
__new__ has been called. # <- ちゃんと出た。
>>> Hoge
<class '__main__.Hoge'>
ちゃんとコールされた!なるほど。 って言うより、実際の動きと自分の捉え方が全く逆だった事を、 Python リファレンスマニュアル の「 3.3.3 クラス生成をカスタマイズする 」を読み直してみてようやく理解したよ。 __metaclass__.__new__ がダイレクトに呼び出されるのでは無くて、 __metaclass__ がコールされた結果として __new__ が呼び出されるのね。
これが理解出来て、やっとこさ Django の newforms.form_for_model や newforms.form_for_instance で何が行われてるかがちゃんと理解出来たよ ![]()
- Posted at:
- 2008/03/17 00:33:31
- 0 Comments
- 1 TrackBack
- Trackback:
- http://humming.via-kitchen.com/2008/03/17/little-learning-metaclass-on-python/trackback/
TrackBacks
[Python][Mercurial]巡回 - 常山日記
[OSS][hg]Mercurialでバージョン管理から除外するファイルの指定 Perlクックブックのお題をPythonで解いてみた その49 1234567 を 1,234,567 にする正規表現をPythonで書こうとしたら不思議な目に遭った Python で標準入力を受け取る [プログラミング][Python]pySerial でシ
- Created at:
- 2008/03/17 12:28:25
Comments
まだ登録されていません。