Python - dir()、__dict__、vars()の違い

Pythonでオブジェクトの属性を表示する際に使われるdir()、__dict__、vars()の 違いについて説明します。 まずはそれぞれの用語説明をして、次に違いについて解説します。

dir()関数

dir()は組み込み関数の1つで、オブジェクトの属性(プロパティ・メソッド) を表示します。属性の中には__class__のような特殊属性も含まれます。

li = [1, 2, 3]

print(dir(li)) # リストの属性を表示
実行結果
['__add__', '__class__', '__contains__',
途中省略
'remove', 'reverse', 'sort']

上のように属性名がリストとして取得できます。

__dict__

__dict__はオブジェクトの特殊属性で、 オブジェクトが持つプロパティの名前と値の組み合わせを ディクショナリとして持っています。

但し、すべてのオブジェクトが__dict__属性を持っているわけではありません。 ライブラリ・クラス・インスタンスなどのオブジェクトは持っていますが、 文字列やリストなどのオブジェクトは__dict__属性はありません。

class Student:
	# コンストラクタ
	def __init__(self, id, name):
		self.id = id
		self.name = name

	def getId(self):
		return self.id

s = Student(1, "阿部")

print(s.__dict__)
実行結果
{'id': 1, 'name': '阿部'}

上のようにプロパティ名と値の組み合わせをディクショナリとして取得できます。

vars()関数

vars()は組み込み関数の1つで、オブジェクトの__dict__属性を返します。 vars()と__dict__で取得できる内容は同じです。

class Student:
	# コンストラクタ
	def __init__(self, id, name):
		self.id = id
		self.name = name

	def getId(self):
		return self.id

s = Student(2, "井上")

print(vars(s))
実行結果
{'id': 2, 'name': '井上'}

__dict__と同じようにプロパティ名と値の組み合わせをディクショナリとして取得できます。

違いについて

取得できる属性

dir()はプロパティ、メソッド、特殊属性の全ての属性名を取得できます。
一方__dict__とvars()はプロパティのみ取得でき、 メソッドや特殊属性は取得できません。

値を取得できるかどうか

dir()で取得できるのは属性名だけです。値は取得できません。
一方、 __dict__とvars()はプロパティ名と値の組み合わせを取得できます。

対象となるオブジェクト

dir()は全てのオブジェクトが対象となります。
一方、__dict__とvars()は__dict__属性を持つオブジェクトのみが対象となります。 ですから文字列やリストのように__dict__属性を持たないオブジェクトでは __dict__やvars()は使えません。