2008年11月19日水曜日

やりたかったことはこっちだ。

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
別にpropertyでなくてよい。classが生成されたときに、継承ツリーに沿って計算してくれればいい。いちいち継承されたクラスでごたごた書いたり、meta classを使う側のクラスの定義を汚し(継承ツリーをたどるコードを書く)たくない。

あとは_xをdelすれば完全犯罪(?)です。


class KlassMeta(type):
def __init__(cls, name, bases, dictionary):
base = cls.__base__
if base == object:
cls.x = dictionary.get('_x', 0)
else:
cls.x = dictionary.get('_x', 0) + base.x

class Klass(object):
__metaclass__ = KlassMeta
_x = 1

class DerivedKlass(Klass):
_x = 2

print Klass.x
print DerivedKlass.x

kp = Klass()
dkp = DerivedKlass()
print kp.x
print dkp.x

実行結果

1
3
1
3

あたまがmetametaでござる。

0 件のコメント: