2008年9月1日月曜日

metaclass

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
まずは書いてみる。

class _MyMetaclass(type):
def __init__(cls, name, bases, dct):
print '_MyMetaclass::__init__'

class MyClass(object):
__metaclass__ = _MyMetaclass

def __init__(self):
print 'MyClass::__init__'

これを実行すると

'_MyMetaclass::__init__

と表示される。MyClassのinstanceは生成していないのでMyClass::__init__は表示されない。
MyClass自体は生成され、その過程で前出の表示が行われる。このfileをimportしても表示される。(ファイルを読んで評価したタイミングというべきかな?)

で、前のentryのTemplateがmetaclassでは、正規表現のcompileが行われているので、

xxx = re.compile(yyy)

としているようなファイルをimportするのと同じタイミングで正規表現がCompileされる。dctの中身にpatternがあるかどうかチェックしているので一回しかcompileされない。この点に関しては同じ事はinstance/classレベルでも可能。

0 件のコメント: