2015年4月26日日曜日

Python でグローバルスコープに動的に作成したクラスを追加

環境
Python 3.4.0

globals() でグローバルシンボルテーブルを取得できますが、このテーブルにクラス名をキー名として、 type() で作成したクラスを値とした項目を追加すると良いようです。

test.py をこんな感じで書いてみました。

#!/usr/bin/env python3

class BaseClass:
    def print_message(self):
        print(self.message)

def add_class():
    dGlobals = globals()
    dGlobals['DerivedClass'] = type(
        'DerivedClass',
        (BaseClass,),
        {'message': 'Hello'}
    )

def main():
    add_class()

    oDerivedClass = DerivedClass()
    oDerivedClass.print_message()

if __name__ == '__main__':
    main()

実行すると期待どおり Hello が表示されました。

$ ./test.py
Hello

クラスを動的に作成しているのは test.py の以下の部分です。

dGlobals = globals()
dGlobals['DerivedClass'] = type(
    'DerivedClass',
    (BaseClass,),
    {'message': 'Hello'}
)

このコードは以下のようなクラス宣言と同等ということで良さそうです。

class DerivedClass(BaseClass):
        message = 'Hello'

0 件のコメント:

コメントを投稿