getattr()とは?意味をわかりやすく簡単に解説
公開:
Pythonの開発でオブジェクトの属性を動的に取得する際、指定した属性が存在しなくてエラーが発生してしまった経験はないでしょうか。組み込み関数であるgetattr()を適切に活用すれば、エラーによるプログラムの強制終了を防ぎながら、柔軟な属性参照を実現できます。
この記事では、getattr()とはどのような機能なのかという基本定義に加え、具体的な使い方やエラーを防ぐためのデフォルト値の設定方法まで分かりやすく整理しました。Pythonにおける動的なデータ処理や安全なコード設計について学びたい方は、ぜひ参考にしてください。
目次
- Pythonのgetattr()とは
- getattr()で動的に属性を取得する方法
- 2つの引数で指定の属性を取得する
- 3つの引数でデフォルト値を指定する
- getattr()でメソッドを動的に呼び出す手順
- オブジェクトから特定のメソッドを取得する
- 取得したメソッドを実行する
- getattr()の類似機能における挙動の違い
- hasattr()で属性の存在を確認する
- __getattr__で未定義の属性をフックする
- __getattribute__ですべてのアクセスをフックする
- getattr()に関するよくある質問
- getattr()を使うメリットは何ですか?
- getattr()で存在しない属性を指定するとどうなりますか?
Pythonのgetattr()とは
Pythonにおけるgetattr()とは、オブジェクトから指定した属性の値を動的に取得するための組み込み関数です。Python公式ドキュメントではgetattr(object, name[, default])という書式で定義されています。
Return the value of the named attribute of object. name must be a string.
出典:Python Built-in Functions / Python 3.14.7 documentation
第二引数の属性名は文字列で渡し、第三引数のdefaultを省略した場合は指定した属性が存在しないとAttributeErrorが送出される仕様です。
通常の開発では、オブジェクト名の後ろにドットを繋げて属性を指定する「ドット記法」が広く使われています。しかし、プログラムの実行時になって初めて属性名が決まるような動的な処理では、静的なドット記法では対応できません。
このような課題を解決するために、属性名を文字列として渡すことによって、動的なアクセスを可能にする仕組みが提供されました。存在しない属性名が指定された場合でも、あらかじめ指定したデフォルト値を返す安全な設計が可能です。
getattr()の主な特徴と、通常のドット記法との違いを比較した表は、以下の通りです。
| 比較項目 | 通常のドット記法 | getattr()による取得 |
|---|---|---|
| 属性名の指定方法 | 直接記述する | 文字列で指定する |
| 不在時のエラー | 例外が発生する | defaultの有無で挙動が変わる |
| 主な用途 | 静的なデータ参照 | 動的なデータ処理 |
このように、静的な参照しかできないドット記法に対し、文字列を用いて動的にアプローチできる点がgetattr()の大きなメリットだと言えます。
ただし、第三引数のdefaultを省略した場合は、ドット記法と同様にAttributeErrorが送出されるため、エラーを回避できるのはdefaultを指定した場合に限られる点に注意してください。
getattr()で動的に属性を取得する方法
Pythonでgetattr()を用いてオブジェクトから属性を動的に取得する際、指定する引数の数によって、挙動が異なります。この関数の基本的な使い方を整理しました。
属性の取得における安全性を高めるため、まずは引数の数に応じた動作の違いを比較した表を以下にまとめました。
| 引数の数 | 指定する項目 | 属性が存在しない場合の挙動 |
|---|---|---|
| 2つの引数 | オブジェクト、属性名 | エラー(例外)が発生する |
| 3つの引数 | オブジェクト、属性名、デフォルト値 | 指定したデフォルト値を返す |
このように、エラーを未然に防ぎたい場合は、引数を3つ指定してデフォルト値を設定しておく設計が役立ちます。
2つの引数で指定の属性を取得する
getattr()に引数を2つだけ渡す方法は、対象の属性が確実に存在していることが前提となる最もシンプルな取得手順です。第一引数に対象オブジェクト、第二引数に属性名の文字列を指定します。
ドット記法をそのまま置き換える形で使用でき、変数に格納された文字列を用いて動的にアクセスできるのが特徴です。実際の開発現場における主な特徴を以下に整理しました。
- 属性名をプログラムの実行時に動的に指定できます
- 対象のオブジェクトに属性が存在しない場合は例外が発生します
- 存在が保証されている設定情報の読み込みに適した方法です
実際の動作を確認できるコード例は、以下の通りです。
class User:
def __init__(self):
self.name = "Taro"
user = User()
print(getattr(user, "name"))
# 出力: Taro
print(getattr(user, "age"))
# AttributeError: 'User' object has no attribute 'age'
属性が存在しない場合に発生する例外を適切に処理しないと、プログラムが途中で強制終了します。そのため、事前の存在確認や例外処理の設計が欠かせません。
3つの引数でデフォルト値を指定する
getattr()に第三引数としてデフォルト値を渡す方法は、存在しない属性を指定した際のエラーを回避するための安全な手順です。この方法を採用することによって、例外処理の記述を大幅に簡略化できます。
属性が見つからない場合でも、プログラムを止めずに処理を続行できる安全な設計が可能です。この方法がもたらす効果と具体的なメリットを以下にまとめました。
- 属性が存在しない場合に指定した代替値が返されます
- 例外をキャッチするための冗長なコードを記述する必要がありません
- ユーザー入力などの不確定なデータを扱う処理の安全性が向上します
デフォルト値を指定した場合のコード例は、以下の通りです。
class User:
def __init__(self):
self.name = "Taro"
user = User()
print(getattr(user, "age", "未設定"))
# 出力: 未設定
デフォルト値には数値や文字列だけではなく、オブジェクト自体や特別な定数を指定することも可能です。システム全体の動作に影響を与えない適切な初期値を設定しておきましょう。
getattr()でメソッドを動的に呼び出す手順
Pythonのgetattr()は、オブジェクトの変数や定数といった属性だけではなく、定義されているメソッド(関数)も動的に取得できます。実行時まで呼び出す処理が確定しない状況において、この機能は柔軟な設計を可能にする仕組みです。
メソッドを安全に動的呼び出しするためには、手順を2つのフェーズに分けて理解しておく方法が効果的です。以下に動的呼び出しの全体像と各ステップの要約をまとめました。
| ステップ | 処理内容 | 主な役割 |
|---|---|---|
| ステップ1 | 特定のメソッドを取得する | 対象オブジェクトから名前を基に処理を抽出する |
| ステップ2 | 取得したメソッドを実行する | 抽出した処理に引数を渡して実際に起動する |
この2つのステップを順に踏むことによって、条件分岐を複雑に並べることなく、スマートに目的の処理を呼び出せます。各ステップの具体的な詳細について整理しました。
オブジェクトから特定のメソッドを取得する
最初のステップでは、getattr()の引数に対象オブジェクトとメソッド名の文字列を渡して、メソッド自体を取得します。Pythonでは、メソッドも丸括弧を付けて呼び出せるオブジェクト、すなわち「callable」の一種として扱われるのが特徴です。
この段階では、まだメソッドの後ろに丸括弧を付けないため、処理自体は実行されません。まずはエラーを防ぎながら安全にメソッドを取得するためのポイントを、以下の通りです。
- メソッド名を変数に格納した文字列として動的に指定します
- 存在しないメソッド名が渡された場合に備えてデフォルト値を設定しておくと安全です
- 取得したデータが実行可能(呼び出し可能)であるか事前に検証する設計が推奨されます
対象オブジェクト内に該当する名称のメソッドが存在しない場合は、属性と同様に例外が発生します。そのため、事前の存在確認や例外処理に関する設計を施しておきましょう。
メソッド名がユーザー入力や外部APIの応答など不確定な情報に由来する場合、そのまま渡すと想定していない公開メソッドまで実行されるリスクがあります。呼び出しを許可するメソッド名をあらかじめホワイトリストや対応表で限定したうえで、callable()による確認と例外処理を組み合わせる設計が安全です。
取得したメソッドを実行する
メソッドのオブジェクトを無事に取得できたら、次のステップでそのメソッドを実際に実行します。取得したメソッドを格納した変数に対して、通常の関数と同じように丸括弧を付加する手順です。
丸括弧の中には、そのメソッドが必要とする引数を通常通りに渡せます。実行時のエラーを防ぎ、意図した通りの出力を得るための主な注意点は、以下の通りとなります。
- 呼び出し先のメソッドが要求する引数を渡しますが、デフォルト引数や可変長引数(*args・**kwargs)があれば個数が完全に一致していなくても呼び出せます
- Pythonの型注釈は実行時に自動で強制されないため、型の不一致を検出したい場合は別途明示的な検証処理が必要です
- メソッドではない通常の属性(文字列や数値など)を誤って呼び出そうとするとエラーになります
- 実行に失敗した際の影響を最小限に抑えるため、呼び出し処理全体を保護する設計を推奨します
ここまでの手順を組み合わせたコード例は、以下の通りです。
class Calculator:
def add(self, a, b):
return a + b
calc = Calculator()
method = getattr(calc, "add", None)
if callable(method):
print(method(2, 3))
# 出力: 5
動的なメソッドの呼び出しは、条件分岐であるif文を大量に並べる手間を省くために非常に有効な技術です。処理の拡張性を高め、メンテナンス性の優れたプログラムを構築する上で、大きな効果を発揮します。
getattr()の類似機能における挙動の違い
ここでは、getattr()を使い分けるうえで押さえておきたい関連機能を、注意点として簡潔に整理します。hasattr()や特殊メソッドは、呼び出されるタイミングや目的がgetattr()と異なるため、違いを押さえておくと安全な実装につながる点が特徴です。
各機能の目的や呼び出しのタイミングにおける決定的な違いを比較した表は、以下の通りです。
| 機能名 | 主な目的 | 呼び出されるタイミング |
|---|---|---|
| hasattr() | 属性の存在確認 | 任意のタイミングで明示的に呼び出す |
| __getattr__ | 未定義属性のフック | 通常の属性アクセスが失敗したときのみ |
| __getattribute__ | すべてのアクセス制御 | 属性へのアクセスが発生したときは常に |
このように、目的の動作や呼び出しのタイミングに合わせて、適切な機能を使い分けるアプローチが推奨されます。
hasattr()で属性の存在を確認する
属性を取得できるかどうかだけを事前に判定したい場面では、hasattr()が使えます。この関数は内部でgetattr()を実行し、AttributeErrorが送出されずに処理が完了するかどうかで存在の有無を判定する仕組みです。
プロパティのように属性アクセス自体が処理を伴う場合、hasattr()の呼び出し中にもその処理が実行される点に注意が必要です。事前に存在を確認してから安全に処理を進めるための主な特徴を以下に整理しました。
- 第一引数にオブジェクト、第二引数に属性名の文字列を渡します
- 属性の取得中にAttributeErrorが送出されなければ真(True)、送出されれば偽(False)を返します
- エラーによるプログラムの強制終了を未然に防ぐ手段として有効な方法です
戻り値が真偽値で返ってくるため、if文の分岐条件にそのまま組み込んで使用するのが一般的なアプローチです。
ただし、属性の値も必要な処理では、hasattr()で確認した直後にドット記法で再アクセスすると同じ属性を二重に取得してしまいます。値も使う場合は、getattr()を一度だけ呼び出し、デフォルト値で存在の有無を判定する設計が基本です。
__getattr__で未定義の属性をフックする
クラスの定義で特殊メソッドの__getattr__を実装すると、存在しない属性へアクセスした際の挙動を独自にカスタマイズできます。getattr()が呼び出し側で個別に例外処理をする関数であるのに対し、__getattr__はクラス側にあらかじめ組み込む代替ロジックという違いがあります。
未定義の属性に対するエラーを回避し、動的なフォールバックを実装する際の主なポイントを以下にまとめました。
- 通常の属性(__dict__などに格納されている既存の属性)へのアクセス時には起動しません
- 存在しない属性が指定された場合に初めてフックして代替値を生成できます
定義されていない属性が呼ばれた時点で動的に値を返せるため、クラスの柔軟性を高める設計に役立ちますが、このメソッドの中で適切なエラーハンドリングを行わないと、バグの発見が難しくなるリスクに注意が必要です。
__getattribute__ですべてのアクセスをフックする
もう一つの特殊メソッドである__getattribute__は、属性が実際に存在するかどうかにかかわらず、ドット記法やgetattr()による参照が発生するたびに必ず経由する強力な機能です。getattr()やhasattr()のように呼び出し側で都度使う関数ではなく、クラス側で常時働く点が異なります。
すべての属性アクセスを監視・制御する役割を持つこの機能の主な性質は、以下の通りです。
- 属性の有無を問わず、すべてのルックアップに対して無条件で実行されます
- 内部での記述方法を誤ると、無限ループを発生させて強制終了する危険を伴います
強力な制御を行える一方で、メソッドの内部でオブジェクト自身の属性を普通に参照すると再度このメソッドが呼び出されて無限再帰に陥るため、実装時は注意が必要です。
getattr()に関するよくある質問
Pythonの動的属性アクセスをサポートするgetattr()について、開発の現場でよく寄せられる疑問とその回答をまとめました。安全な例外設計や実装上のメリットを理解する手がかりとしてお役立てください。
getattr()を使うメリットは何ですか?
通常のドット記法とは異なり、実行時に文字列を用いて動的に属性を取得できる点が最大のメリットです。これにより、条件分岐(if-elifなど)を大量に並べることなく、シンプルで拡張性の高いプログラムを設計できます。
また、属性が存在しない場合に備えてデフォルト値を引数で指定できるため、例外処理のコードを記述する手間を省いて安全性を高めることが可能です。
getattr()で存在しない属性を指定するとどうなりますか?
デフォルト値を指定せずに存在しない属性を指定した場合、例外(AttributeError)が送出されます。try-exceptで捕捉しなければプログラムは強制終了しますが、捕捉すればその場で処理を継続できます。
属性の欠損を通常の流れとして扱いたい場合は第三引数にデフォルト値を指定し、想定外のバグとして扱いたい場合はtry-exceptで例外を捕捉する設計が基本です。あるいは、事前にhasattr()を用いて対象のオブジェクト内に目的の属性が存在するか調べる手順を挟む方法も、エラーの防止に有効です。
左へフリックで次のページ、右へフリックで前のページに戻れます左右の矢印ボタン、左右のスワイプで移動できます







