今日の記事では、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クラスで name と roll_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: AmitRoll 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 instanceprint(f"Age: {getattr(student, 'age')}")
|
結果は以下の通りです。
Name: AmitRoll No: 8Traceback (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 providedprint(f"Age: {getattr(student, 'age', 100)}")
|
結果は以下の通りです。
Name: AmitRoll No: 8Age: 100 |
なぜ getattr() を使う必要があるのでしょうか?
この関数は object.attribute_name と同等であると先に述べましたので、この関数のポイントは何でしょうか?
ドット記法を使った上記の記述は正しいのですが、これは呼び出した時点で属性名が実際に定義されている場合のみ有効です!
ですから、オブジェクトの構造が時々変化するようなクラスでは、 getattr() を使ってオブジェクトが特定の状態であるかどうかをチェックすることができます!
また、例外を簡単に処理したり、フォールバックのデフォルト値を提供したりするための非常に良い方法を提供してくれます。
何か問題が発生した場合には、 AttributeError 例外をキャッチするか、デフォルトの値を検査することができます。
これで、なぜこれが便利なのか、もう少しはっきりしたかと思います。
まとめ
W