Pythonでは、リフレクションとインロスペクションの機能が提供されています。この記事では、これらのテクニックによって、クラスやオブジェクトの内部情報を動的に調査したり操作したりする方法を具体的なコード例とともに解説します。また、実践的な応用例も3つ紹介します。
リフレクションとは?
リフレクションとは、プログラムが自分自身の構造と動作を調査・変更する手法の一つです。Pythonでは`type()`や`isinstance()`などの組み込み関数、または`getattr()`、`setattr()`、`dir()`などを使ってリフレクションを行います。
基本的なリフレクションの例
class MyClass:
def my_method(self, x):
return x * 2
obj = MyClass()
# 属性名からメソッドを取得して実行
method = getattr(obj, "my_method")
print(method(5)) # 出力:10
上のコードでは、`getattr()`を使用して`MyClass`のインスタンスから`my_method`メソッドを動的に取得しています。そして、取得したメソッドを実行しています。
インロスペクションとは?
インロスペクションとは、オブジェクトの型や属性、メソッドなどを調査することです。`dir()`や`vars()`などがよく使われます。
基本的なインロスペクションの例
print(dir(obj)) # MyClassのすべての属性とメソッドをリストで取得
`dir()`関数を使って、`MyClass`のインスタンスに含まれるすべての属性とメソッドを調査しています。
応用例
応用例1:動的な属性の追加
setattr(obj, "new_attr", 100)
print(obj.new_attr) # 出力:100
この例では、`setattr()`を使って新しい属性`new_attr`を動的に追加しています。
応用例2:メソッドの存在チェックと動的呼び出し
if hasattr(obj, "my_method"):
print(getattr(obj, "my_method")(5)) # 出力:10
`hasattr()`を用いて、`my_method`メソッドが存在するか確認し、存在すればそのメソッドを動的に呼び出しています。
応用例3:クラスの属性とメソッドを一覧表示
for name in dir(obj):
if not name.startswith("__"):
print(name, getattr(obj, name))
`dir()`関数と`getattr()`関数を組み合わせて、`MyClass`のすべての公開属性とメソッドを一覧表示しています。
まとめ
Pythonのリフレクションとインロスペクションは、動的なプログラミングを実現する強力なツールです。本記事では基本的な用法から応用例までを解説しました。この知識を使って、より柔軟なコードを書くことができるでしょう。
コメント