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。


簡単に実装してみると、こんな感じになります。


  1. # -*- coding:utf-8 -*-
  2. class Sample(object):
  3.     
  4.     def add(self, key, value):
  5.         self.__dict__[key] = value
  6.         
  7. s = Sample()
  8. # testというキーで値を設定する。
  9. s.add('test', 'testの値')
  10. print s.test
  11. # 値を変更してみる。
  12. s.test = '変更'
  13. print s.test




実行してみると、動的にtestというプロパティを作成し、値を設定することができました。

testの値
変更







当初の構想通り、設定ファイルの内容を解析して、プロパティを追加するようにしてみます。


  1. # -*- coding:utf-8 -*-
  2. class Config(object):
  3.     
  4.     def __init__(self, config_file):
  5.         f = open(config_file, 'r')
  6.         for line in f:
  7.             kv = line.strip().split('=')
  8.             
  9.             key = kv[0].strip()
  10.             value = kv[1].strip()
  11.             
  12.             self.__dict__[key] = value
  13.         
  14. conf = Config('param.txt')
  15. print conf.param1
  16. print conf.param2
  17. print conf.param3




実行してみると、狙い通りの動作になりました。

param1_value
param2_value
param3_value








メソッドの追加



プロパティが動的に追加できるのであれば、メソッドも動的に追加できるはず。


  1. # -*- coding:utf-8 -*-
  2. class Sample(object):
  3.     
  4.     def add_function(self, name, func):
  5.         self.__dict__[name] = func
  6.         
  7. def func_1():
  8.     print 'hello'
  9. def func_2(name):
  10.     print 'hello ' + name
  11. s = Sample()
  12. s.add_function('say_hello', func_1)
  13. s.add_function('say_hello_with_name', func_2)
  14. s.say_hello()
  15. s.say_hello_with_name('symfo')




実行してみると、いい感じです。

hello
hello symfo





関連記事

コメント

参考にさせて頂きます

Re: タイトルなし

お役にたてたようで嬉しいです。

プロフィール

Author:symfo
blog形式だと探しにくいので、まとめサイト作成中です。
https://symfo.web.fc2.com/

PR

検索フォーム

月別アーカイブ