Pythonでオブジェクトに対し、動的にプロパティやメソッドを追加する
例えば、こんな設定ファイルがあるとします。
param1 = param1_value
param2 = param2_value
param3 = param3_value
ファイルの内容を解析したあとは、普通は辞書型のオブジェクトに値を設定し、
使用するかと思います。
ざっくりとしたイメージはこんな感じ。
conf = load('param.txt');
print conf['param1']
print conf['param2']
print conf['param3']
これでも良いのですが、以下のように動的にオブジェクトへプロパティを追加し、
アクセスできたら面白そうです。
conf = load('param.txt');
print conf.param1
print conf.param2
print conf.param3
やってみる
Pythonの技法:プロパティによるアクセサの実装
http://builder.japan.zdnet.com/script/20364276/
こちらを参考にさせて頂きました。
__dict__にキーと値を設定すればOK。
簡単に実装してみると、こんな感じになります。
- # -*- coding:utf-8 -*-
- class Sample(object):
- def add(self, key, value):
- self.__dict__[key] = value
- s = Sample()
- # testというキーで値を設定する。
- s.add('test', 'testの値')
- print s.test
- # 値を変更してみる。
- s.test = '変更'
- print s.test
実行してみると、動的にtestというプロパティを作成し、値を設定することができました。
testの値
変更
当初の構想通り、設定ファイルの内容を解析して、プロパティを追加するようにしてみます。
- # -*- coding:utf-8 -*-
- class Config(object):
- def __init__(self, config_file):
- f = open(config_file, 'r')
- for line in f:
- kv = line.strip().split('=')
- key = kv[0].strip()
- value = kv[1].strip()
- self.__dict__[key] = value
- conf = Config('param.txt')
- print conf.param1
- print conf.param2
- print conf.param3
実行してみると、狙い通りの動作になりました。
param1_value
param2_value
param3_value
メソッドの追加
プロパティが動的に追加できるのであれば、メソッドも動的に追加できるはず。
- # -*- coding:utf-8 -*-
- class Sample(object):
- def add_function(self, name, func):
- self.__dict__[name] = func
- def func_1():
- print 'hello'
- def func_2(name):
- print 'hello ' + name
- s = Sample()
- s.add_function('say_hello', func_1)
- s.add_function('say_hello_with_name', func_2)
- s.say_hello()
- s.say_hello_with_name('symfo')
実行してみると、いい感じです。
hello
hello symfo
- 関連記事
-
- Python loggingモジュールの基本的な使い方
- Pythonでモダンなファイルの開き方
- Pythonでオブジェクトに対し、動的にプロパティやメソッドを追加する
- Pythonでtry exceptの書き方と、エラー内容の取得方法
- MinGWのmingw32-makeを使って、PythonのC言語拡張をビルドする
コメント
2011/12/23 22:31 by - URL 編集
Re: タイトルなし
2011/12/23 23:53 by symfo URL 編集