Pythonでオブジェクトに対し、動的にプロパティやメソッドを追加する(setattr)

Pythonでオブジェクトに対し、動的にプロパティやメソッドを追加する方法として、
__dict__に直接アクセスしてました。

Pythonでオブジェクトに対し、動的にプロパティやメソッドを追加する


Pythonのドキュメントを読んでみると、setattrという
そのものずばりの組み込み関数があることを知りました。

http://www.python.jp/doc/release/library/functions.html#setattr

早速試してみます。




同じことをやってみる





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



もしくは、こちらの書き方でもOK。


  1. # -*- coding:utf-8 -*-
  2. class Sample(object):
  3.     pass
  4. s = Sample()
  5. # testというキーで値を設定する。
  6. setattr(s, 'test', 'testの値')
  7. print s.test
  8. # 値を変更してみる。
  9. s.test = '変更'
  10. print s.test




実行してみると、こんな感じで動的にtestというプロパティが追加できています。

$ python sample.py
testの値
変更






こんなかんじで、関数の追加も行えます。

  1. # -*- coding:utf-8 -*-
  2. class Sample(object):
  3.     def add(self, key, value):
  4.         setattr(self, key, value)
  5. s = Sample()
  6. # ファンクションもOK
  7. s.add('test_func', lambda x,y : x + y)
  8. print s.test_func(1, 2)




実行結果

$ python sample.py
3









getattr



getattrを使用すれば、文字列でメソッドの値を取得できます。
Javaで言うリフレクションでしょうか。


  1. # -*- coding:utf-8 -*-
  2. class Sample(object):
  3.     def __init__(self):
  4.         self.test = "testの値"
  5. s = Sample()
  6. print getattr(s, 'test')



実行結果

$ python sample.py
testの値






こんなかんじで関数の登録と呼び出しも行えます。


  1. # -*- coding:utf-8 -*-
  2. class Sample(object):
  3.     def __init__(self):
  4.         self.test_func = lambda x,y : x + y
  5. s = Sample()
  6. print getattr(s, 'test_func')(1, 2)



実行結果

$ python sample.py
3

関連記事

コメント

プロフィール

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

PR

検索フォーム

月別アーカイブ