Pythonでhasattr関数を使ってオブジェクトに特定のプロパティ(属性)があるかチェックする

スポンサーリンク

今回は、Pythonのhasattr()メソッドの挙動を詳しく公開します。


スポンサーリンク

Python hasattr() メソッドの必要性

オブジェクト指向プログラミングの世界では、現実のシナリオをクラスとオブジェクトに表現またはマッピングすることを扱います。

オブジェクトは、属性とその振る舞いを記述したクラスの青写真と考えることができます。

時には、あるクラスが持つ属性の存在を確認しなければならない場面に出くわすことがあります。

これは、Pythonのhasattr()メソッドで実現できます。

これは、クラス内に属性が存在するかどうかを確認するのに役立ちます。

さて、Python hasattr()メソッドの必要性と由来を理解したところで、同じように動作することを理解しましょう。


Pythonのhasattr()メソッドの動作について

Pythonのクラスは、オブジェクトを通して属性とその振る舞いを表現します。

hasattr()メソッドは、クラス内に属性が存在するかどうかを確認するために使用されます。

hasattr(Class, attribute)

hasattr() メソッドは、クラス内に属性が存在するかどうかによって True か False のいずれかのブール値を返します。

例 1:

class Info:
  name = "JournalDev"
  lang = "Python"
  site = "Google"
print(hasattr(Info, 'lang'))

上記の例では、属性 ‘lang’ はクラス ‘Info’ に含まれています。

従って、hasattr() 関数は True を返します。

結果は以下の通りです。

True

例として以下の様になります。

class Info:
  name = "JournalDev"
  lang = "Python"
  site = "Google"
print(hasattr(Info, 'date'))

上の例で見られるように、属性 ‘date’ はクラスで定義されていないので、hasattr() 関数は False を返します。

出力は以下の通りです。

False

Python 2 の hasattr() メソッドと Python 3 の hasattr() メソッドの比較

Python 2では、hasattr()はすべての例外に打ち勝ち、条件に対してFalseを返します。

例えば、ある属性’A’がクラスに含まれているが、いくつかの例外に占有されている場合です。

このとき、hasattr()はすべての例外を無視し、たとえ属性’A’がクラス内に存在したとしても、Falseを返します。

一方、Python 3では、hasattr()はその属性が何らかの例外的な条件に該当する場合に例外を発生させます。

例 Python 2とhasattr()関数

class Info(object):
     @property
     def hey(self):
         raise SyntaxError
     def say(self):
         raise SyntaxError
obj = Info()
 
print(hasattr(obj,'hey'))
print(hasattr(obj,'say'))

上記のコードでは、デコレータによる構文エラーにもかかわらず、hasattr()メソッドはエラーを発生させず、クラスがたまたまその特定の属性を含んでいたとしても、例外を無視してFalseを返しています。

結果は以下の通りです。

False
True

例 Python 3 と hasattr() 関数

以下のコードでは、hasattr()関数が属性’hey’でSyntax Errorの原因による例外エラーを発生させます。

class Info(object):
     @property
     def hey(self):
         raise SyntaxError
     def say(self):
         raise SyntaxError
obj = Info()
 
print(hasattr(obj,'hey'))
print(hasattr(obj,'say'))

出力されます。

Traceback (most recent call last):
 
  File "c:usershpppdatalocalprogramspythonpython36libsite-packagesIPythoncoreinteractiveshell.py", line 3319, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
 
  File "<ipython-input-20-e14f6e57b66e>", line 9, in <module>
    print(hasattr(obj,'hey'))
 
  File "<ipython-input-20-e14f6e57b66e>", line 4, in hey
    raise SyntaxError
 
  File "<string>", line unknown
SyntaxError

まとめ

以上、Python hasattr()の動作について、Pythonバージョン2および3での動作を理解しました。


参考文献

  • Pythonのhasattr()メソッド – JournalDev
タイトルとURLをコピーしました