2016/10/13更新

[Python] インスタンスのプロパティへ動的にアクセスする

このエントリーをはてなブックマークに追加            

こんにちは、絶賛Pythonコーディング中の@yoheiMuneです。
今日はPythonのインスタンスに対して、動的にプロパティを追加したり読み取ったりする方法をブログに書きたいと思います。

画像

Pythonでデータを持つにはクラスのインスタンスが便利

Pythonでデータを保持するためには、配列、辞書、タプルなどいろいろとありますが、個人的にはクラスのインスタンスが便利です。例えば以下のような空っぽのクラスを作ります。
# 空っぽクラス
class Container():
    pass
そのクラスに対して、好きなプロパティを追加していくことで、データを保存します。
c = Container()
c.name = "Yohei"
c.age = 30
c.city = "Yokohama"
この保持の仕方であれば辞書(Dictionary)でもできますが、文字列でキーを指定するところがちょっと面倒です。
c = dict()
c["name"] = "Yohei"
c["age"] = 30
c["city"] = "Yokohama"
と、こんな感じでクラスのインスタンスを使えますが、そのインスタンスについて動的にプロパティへアクセスする方法を書きたいと思います。



インスタンスのプロパティに動的にアクセスする

さて上記の方法でプロパティの追加/読み取りを行うことができますが、時々はプロパティ名を文字列で指定したい場合があります。その場合には組み込み関数のsetattrgetattrを使います。
# プロパティを追加(プロパティ名を文字列で指定)
setattr(c, "key", "value")
print(c.key) # => value

# プロパティを読み取り(プロパティ名を文字列で指定)
val = getattr(c, "key")
print(val) # => value
これを使うと辞書型のようにプロパティ名を文字列でも指定できます。時々これが必要になるんですよね。便利です。



インスタンスのプロパティを全て取得する

インスタンスが持つプロパティは__dict__というプロパティに格納されています。それにアクセスすることで、プロパティを全て取得することができます。
# __dict__を使うと全てのプロパティを取得できます
for key, value in c.__dict__.items():
    print(key, value)

# もう少し厳密にやると、関数などは省くのもOK
for key, value in c.__dict__.items():
    if callable(value) == False:
        print(key, value)
こんな感じで、便利に全てのプロパティにアクセスできます。これはインスタンスに好き勝手値を入れた後、JSONなど出力する際に便利です。



最後に

クラスのインスタンスのプロパティに動的にアクセスすることができるのは便利ですね。他の言語よりも同じことが簡単にできる印象です。この辺とかも学んでいくと、パイソニックなコードが書けるのかなーと思う今日この頃です。

最後になりますが本ブログでは、Python・フロントエンド・開発関連・Swift・Linux・Java・機械学習など雑多に情報発信をしていきます。自分の第2の脳にすべく、情報をブログに貯めています。気になった方は、本ブログのRSSTwitterをフォローして頂けると幸いです ^ ^。

最後までご覧頂きましてありがとうございました!





こんな記事もいかがですか?

RSS画像

もしご興味をお持ち頂けましたら、ぜひRSSへの登録をお願い致します。