to: @wozozo
metaclass1.py
# coding:utf-8 class MyMetaclass(type): """ メタクラス """ def __new__(cls, name, bases, attrs): # fieldsという名前のフィールドからメソッドを生成する def make_method(v): # クロージャ return lambda self: "%s" % v for k, v in attrs.get('fields', {}).iteritems(): attrs[k] = make_method(v) return type.__new__(cls, name, bases, attrs) class MyBaseClass(object): """ メタクラスを使ったクラス """ __metaclass__ = MyMetaclass class MyClass(MyBaseClass): """ メタクラスを使ったクラスを継承したクラス """ fields = {'foo': 'bar', 'hoge': 'fuga'} def main(): obj = MyClass() # fieldsで指定しておいた辞書のキー名でメソッドとしてアクセスできる print obj.foo(), obj.hoge() if __name__ == '__main__': main()
実行結果
$ python metaclass1.py bar fuga
がんばれ。