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__ が呼び出されるのね。

これが理解出来て、やっとこさ Djangonewforms.form_for_modelnewforms.form_for_instance で何が行われてるかがちゃんと理解出来たよ :-)

Posted at: 
2008/03/17 00:33:31
0 Comments
1 TrackBack
Tags: 
book
Python
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

まだ登録されていません。

Add Comment

Add Comment