Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
dir() / vars() / getattr()
オブジェクトの属性やメソッドを動的に確認・取得・設定するための組み込み関数です。デバッグや動的プログラミングで活用されます。
構文
# オブジェクトの属性名・メソッド名の一覧を返します。 dir(オブジェクト) # オブジェクトの __dict__ 属性(属性名と値の辞書)を返します。 vars(オブジェクト) # オブジェクトの指定した属性の値を取得します。 getattr(オブジェクト, 属性名, デフォルト値) # オブジェクトの指定した属性に値を設定します。 setattr(オブジェクト, 属性名, 値) # オブジェクトが指定した属性を持つか確認します。 hasattr(オブジェクト, 属性名) # オブジェクトの指定した属性を削除します。 delattr(オブジェクト, 属性名)
関数一覧
| 関数 | 概要 |
|---|---|
| dir(obj) | オブジェクトが持つ属性名とメソッド名のリストを返します。引数なしで呼ぶと現在のスコープの名前一覧を返します。 |
| vars(obj) | オブジェクトの __dict__ を返します。インスタンスの属性と値を辞書形式で確認できます。 |
| getattr(obj, name, default) | オブジェクトから属性名を文字列で指定して値を取得します。属性が存在しない場合はデフォルト値を返します。 |
| setattr(obj, name, value) | オブジェクトの属性名を文字列で指定して値を設定します。存在しない属性名を指定すると新たに作成されます。 |
| hasattr(obj, name) | オブジェクトが指定した名前の属性を持つ場合は True を返します。 |
| delattr(obj, name) | オブジェクトから指定した名前の属性を削除します。 |
サンプルコード
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def greet(self):
return f"こんにちは、{self.name}です。"
p = Person("太郎", 20)
# dir() でオブジェクトが持つ属性・メソッドを確認します。
attrs = dir(p)
# __init__, __str__ などの特殊メソッドと name, age, greet が含まれます。
# ダンダー(__)で始まる特殊メソッドを除外して表示します。
public_attrs = [a for a in dir(p) if not a.startswith("_")]
print(public_attrs) # ['age', 'greet', 'name']
# vars() でインスタンスの属性を辞書として取得します。
print(vars(p)) # {'name': '太郎', 'age': 20}
# getattr() で属性名を文字列で取得します。
attr_name = "name"
print(getattr(p, attr_name)) # 太郎
print(getattr(p, "height", "不明")) # 不明(デフォルト値)
# メソッドも getattr() で取得して呼び出せます。
greet_method = getattr(p, "greet")
print(greet_method()) # こんにちは、太郎です。
# setattr() で属性の値を動的に設定します。
setattr(p, "age", 21)
print(p.age) # 21
# 新しい属性を動的に追加します。
setattr(p, "city", "東京")
print(p.city) # 東京
# hasattr() で属性の存在を確認してから取得します。
if hasattr(p, "email"):
print(p.email)
else:
print("メールアドレスは登録されていません。")
# delattr() で属性を削除します。
delattr(p, "city")
print(hasattr(p, "city")) # False
概要
これらの関数はPythonのリフレクション(reflection)機能を提供します。属性名を文字列で動的に指定できるため、設定ファイルやユーザー入力に基づいてオブジェクトの属性を操作するようなプログラムに活用できます。
『hasattr()』は内部で『getattr()』を実行して例外の有無を確認します。プロパティが副作用を持つ(データベースアクセスや計算処理など)場合、『hasattr()』を呼んだだけで処理が走ることがあります。このような場合は try-except で属性アクセスを囲む方が安全です。
『dir()』の結果には継承した属性・メソッドも含まれます。そのクラス自身が定義した属性だけを確認したい場合は『vars(ClassName)』でクラスの『__dict__』を直接参照してください。型の確認には『type() / isinstance()』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。