本日は、Pythonのdir()メソッドについて説明します。
では、さっそく始めましょう。
Python dir() メソッドの基礎知識
Python の dir() メソッドは、渡された object の属性名のリストをアルファベット順に取得するために広く利用されています。
dir([object])
 | 
ここで、object はオプションの引数です。
任意の Python オブジェクトが dir() メソッドに渡されると、そのオブジェクトのすべての属性を含むリストが返されます。
また、何も渡されない場合は、すべてのローカル属性のリストが返されます。
オブジェクトに __dir__() メソッドが定義されている場合、 dict() はそのメソッドの呼び出しにつながるので、そのオブジェクトに関連する属性のリストを返すはずです。
Python dir() の例
dir()` メソッドの基本的な使い方を理解したところで、より深く理解するために例を見てみましょう。
#empty dir()print("dir() :", dir())
#list initialisationlist1 = ['name', 'class', 'roll']
#dictionary initialisationdict1 = {0: 'bad', 5: 'fair', 10: 'good'}
print(", dir(list1))
print(", dir(dict1))
 | 
結果は以下の通りです。
dir() : ['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__']
dir(list1) : ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
dir(dict1) : ['__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']
 | 
ご覧のように、dir() メソッドに最初は何も渡さず、次にリストオブジェクト、最後に辞書オブジェクトを渡して、返されたリストを出力しています。
上の出力から、リストオブジェクトと辞書オブジェクトで利用できる属性が異なることがよくわかります。
何も渡さない場合は、ローカルスコープにあるすべてのメソッド名や属性名を取得します。
Python で dir() メソッドを操作する
それでは、 __dir__() メソッドが定義されているオブジェクトだけでなく、ユーザー定義クラスのオブジェクトに対しても dir() 関数を使う例をもう少し試してみましょう。
1. カスタムオブジェクトを使う
さて、リストや辞書のような組み込みクラスに対して dir() メソッドを適用しました。
ここでは、ユーザー定義クラスのカスタムオブジェクトに未定義の __dir__() を適用した場合の結果を試してみましょう。
#classclass shape:
    name = "rectangle"
    sides = 4
obj = shape()
print(dir(obj)) #dir for our custom object
 | 
出力されます。
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'name', 'sides']
 | 
ここで、obj は名前が rectangle で sides = 4 の shape クラスのオブジェクトです。
この obj オブジェクトを dir() メソッドに渡すと、上記のような属性のセットが得られます。
このリストには name と sides 変数も含まれていることに注意してください。
2. 2. 定義された _dir()
先ほど述べたように、__dir__()メソッドが定義されているオブジェクトでは、dir()メソッドは対応する __dir__() メソッドを呼び出し、再び属性のリストを返さなければなりません。
それでは、例によってそのことを理解することにしましょう。
#classclass shape:
    name = "rectangle"
    sides = 4
    def __dir__(self):
        return ['Square','Circle']
obj = shape()
print(dir(obj)) #dir for our custom object
 | 
結果は以下の通りです。

ご覧のように、shapeクラスのオブジェクト obj に対して __dir__() メソッドが呼ばれ、 dir(obj) が呼ばれた場所で上記の属性のリストが返されるのです。
まとめ
この記事では、Pythonのdir()メソッドについて、その動作とさまざまなケースでの使用方法を学びました。
このトピックに関する更なる質問については、以下にコメントしてください。
参考文献
- Python dir() 関数 – Journal Dev Article,
 - なぜ’dir()’はpythonで’dir’という名前なのでしょうか?- StackOverflowの質問です。
 - Python dir() – 公式ドキュメンテーション.