Pythonのgetattrメソッドをクラスに使う方法を解説する

スポンサーリンク

今日の記事では、Pythonのgetattr()関数について見ていきたいと思います。

この関数はPythonのオブジェクトの属性を取得しようとするものです。

これはsetattr()関数と非常によく似ていますが、オブジェクトを変更するわけではありません。

簡単な例を使って、この関数をどのように使うことができるかを見てみましょう。


スポンサーリンク

Pythonの基本的な構文 getattr()

getattr()関数の基本的な構文は以下の通りです。

value = getattr(object, attribute_name[, default_value])

ここでは、 getattr()object を渡しています。

これは、このオブジェクトの attribute_name (文字列でなければならない) を取得しようとするものです。

もし、その属性が存在すれば、それに対応する value を返します。

これは構文と同じです。

value = object.attribute_name

そうでない場合は、2つのケースがあります。

  • もしデフォルト値 (default_value) が提供されていれば、単にそれを使用し、このデフォルト値の値を返します。
  • そうでない場合は、属性が見つからないので、単に AttributeError 例外を発生させます。

getattr()` のポイントは、属性の値を取得するだけでなく、それが存在するかどうかをチェックすることです!

では、理解を深めるためにいくつかの例を見てみましょう。


getattr() の使用法 – いくつかの例

まず簡単な例として、Studentクラスで nameroll_num という属性を持っている場合を考えてみましょう。

ここでは、 getattr() を使って属性を取得します。

class Student():
    def __init__(self, name, roll_no):
        self.name = name
        self.roll_no = roll_no
 
student = Student('Amit', 8)
 
print(f"Name: {getattr(student, 'name')}")
print(f"Roll No: {getattr(student, 'roll_no')}")

結果は以下の通りです。

Name: Amit
Roll No: 8

確かに、正しい属性が設定され、 getattr() を使ってそれらを取得することができました!

さて、この場合、両方の属性が存在していたので、エラーは発生しませんでした。

しかし、クラスの中に設定していない属性を取得することもできます。

class Student():
    def __init__(self, name, roll_no):
        self.name = name
        self.roll_no = roll_no
 
student = Student('Amit', 8)
 
print(f"Name: {getattr(student, 'name')}")
print(f"Roll No: {getattr(student, 'roll_no')}")
 
# Will raise 'AttributeError' Exception since the attribute 'age' is not defined for our instance
print(f"Age: {getattr(student, 'age')}")

結果は以下の通りです。

Name: Amit
Roll No: 8
Traceback (most recent call last):
  File "getattr_example.py", line 12, in <module>
    print(f"Age: {getattr(student, 'age')}")
AttributeError: 'Student' object has no attribute 'age'

ここでは、定義されていない属性を取得しようとしました。

デフォルトのオプションがないため、Pythonは直接Exceptionを発生させました。

もし、デフォルトオプションを '100' に設定したい場合、このケースでは age を取得しようとしても、それがないため、代わりに 100 が返されることになります。

試してみましょう。

class Student():
    def __init__(self, name, roll_no):
        self.name = name
        self.roll_no = roll_no
 
student = Student('Amit', 8)
 
print(f"Name: {getattr(student, 'name')}")
print(f"Roll No: {getattr(student, 'roll_no')}")
 
# Will not raise AttributeError, since a default value is provided
print(f"Age: {getattr(student, 'age', 100)}")

結果は以下の通りです。

Name: Amit
Roll No: 8
Age: 100

なぜ getattr() を使う必要があるのでしょうか?

この関数は object.attribute_name と同等であると先に述べましたので、この関数のポイントは何でしょうか?

ドット記法を使った上記の記述は正しいのですが、これは呼び出した時点で属性名が実際に定義されている場合のみ有効です!

ですから、オブジェクトの構造が時々変化するようなクラスでは、 getattr() を使ってオブジェクトが特定の状態であるかどうかをチェックすることができます!

また、例外を簡単に処理したり、フォールバックのデフォルト値を提供したりするための非常に良い方法を提供してくれます。

何か問題が発生した場合には、 AttributeError 例外をキャッチするか、デフォルトの値を検査することができます

これで、なぜこれが便利なのか、もう少しはっきりしたかと思います。


まとめ

W

タイトルとURLをコピーしました