TL;DR
hasattr() は、文字列がオブジェクトの属性名(メソッドやプロパティ)の一つであった場合 True を返す。オブジェクトが指定の属性を持つかどうか事前に判定することができる。
hasattr() のポイント
- object が name の属性を持っている場合に True を返す
- 引数はオブジェクトと文字列
- 必要な属性のみ確認したい場合に使う
hasattr(object, name)
ドキュメントに「この関数は、getattr(object, name) を呼び出して AttributeError を送出するかどうかを見ることで実装されています。」と書かれている。
つまり、getattr() で指定の属性を取得できれば True 、AttributeError が発生すると False を返す。
hasattr() - 組み込み関数 — Python 3.9.4 ドキュメント
属性を調べる組み込み関数
Python は動的に構成を変更することが可能なので、オブジェクトがどういった変数やメソッドを保持しているのか分からないときがある。
そのようなときに、メソッドを呼び出してうまく実行されるか願うのではなく、要求されているメソッドが存在するかチェックする必要がある。
dir()
dir() 関数を使うとオブジェクトの全ての属性を返すことができる。
class A:
def __init__(self, x, y):
self.x = x
self.y = y
a = A(1, 2)
print(dir(a))
# ['__class__', '__delattr__', '__dict__',... 'x', 'y']
hasattr()
あるオブジェクトが、指定した属性を保持しているかだけ調べたい場合は、hasattr()を使うとよい。
class A:
def __init__(self, x, y):
self.x = x
self.y = y
a = A(1, 2)
print(hasattr(a, 'x'))
# True
メソッドを調べる。
class A:
pass
def b(self):
pass
a = A
a.b(1)
dir(a) # ['b']
hasattr(a, 'b') # True
オブジェクトの属性を操作したい場合
オブジェクトの属性を操作する組み込み関数に、getattr()、setattr()、delattr()があるが、これらを使うと、オブジェクトの属性を動的に操作することができる。