Pythonでオブジェクトに対し、動的にプロパティやメソッドを追加する(setattr)
Pythonでオブジェクトに対し、動的にプロパティやメソッドを追加する方法として、__dict__に直接アクセスしてました。
Pythonでオブジェクトに対し、動的にプロパティやメソッドを追加する
Pythonのドキュメントを読んでみると、setattrという
そのものずばりの組み込み関数があることを知りました。
http://www.python.jp/doc/release/library/functions.html#setattr
早速試してみます。
同じことをやってみる
- # -*- coding:utf-8 -*-
- class Sample(object):
- def add(self, key, value):
- setattr(self, key, value)
- s = Sample()
- # testというキーで値を設定する。
- s.add('test', 'testの値')
- print s.test
- # 値を変更してみる。
- s.test = '変更'
- print s.test
もしくは、こちらの書き方でもOK。
- # -*- coding:utf-8 -*-
- class Sample(object):
- pass
- s = Sample()
- # testというキーで値を設定する。
- setattr(s, 'test', 'testの値')
- print s.test
- # 値を変更してみる。
- s.test = '変更'
- print s.test
実行してみると、こんな感じで動的にtestというプロパティが追加できています。
$ python sample.py
testの値
変更
こんなかんじで、関数の追加も行えます。
- # -*- coding:utf-8 -*-
- class Sample(object):
- def add(self, key, value):
- setattr(self, key, value)
- s = Sample()
- # ファンクションもOK
- s.add('test_func', lambda x,y : x + y)
- print s.test_func(1, 2)
実行結果
$ python sample.py
3
getattr
getattrを使用すれば、文字列でメソッドの値を取得できます。
Javaで言うリフレクションでしょうか。
- # -*- coding:utf-8 -*-
- class Sample(object):
- def __init__(self):
- self.test = "testの値"
- s = Sample()
- print getattr(s, 'test')
実行結果
$ python sample.py
testの値
こんなかんじで関数の登録と呼び出しも行えます。
- # -*- coding:utf-8 -*-
- class Sample(object):
- def __init__(self):
- self.test_func = lambda x,y : x + y
- s = Sample()
- print getattr(s, 'test_func')(1, 2)
実行結果
$ python sample.py
3
- 関連記事
-
- Python + gtk + gladeでGUIアプリケーションの作成 その2(gtk.MessageDialog)
- Python + gtk + gladeでGUIアプリケーションの作成 その1
- Pythonでオブジェクトに対し、動的にプロパティやメソッドを追加する(setattr)
- Python Gmailに届いたメールの内容をmantisに自動で転記する
- PythonでGmailに送信されたメールの内容と添付ファイルを取得する
コメント