Python でクラスの変数などを取得する方法について説明します。いわゆるリフレクションについてです。
クラス情報の取得
以下コードでクラスの情報が取得できます。
import inspect
inspect.getmembers(obj, inspect.isclass)
変数を dict で取得
変数は以下コードで取得します。関数と内部変数以外を取得するようにしています。
import inspect
d = {}
for insp in inspect.getmembers(obj, inspect.isclass):
name = insp[0] # クラス名
c = insp[1]
for key, value in c.__dict__items():
# 内部クラス(先頭"__")と関数を除外
if not key.startswith("__") and not callable(key):
d[key] = value
(参考) Util クラス化
クラス化したものを紹介します。自作のアプリで使いやすいようにパラメータなどを調整しています。
import inspect
from typing import Type
class ReflectionUtil:
@classmethod
def get_classes(cls, obj):
return inspect.getmembers(object, inspect.isclass)
@classmethod
def get_variable_data(cls, obj, is_add_class=False, prefix=""):
d = {}
for insp in cls.get_classes(obj):
name = insp[0]
c = insp[1]
for key, value in c.__dict__.items():
if not key.startswith("__") and not callable(key):
dict_key = key
if is_add_class:
dict_key = f"{name}_{dict_key}"
if prefix:
dict_key = f"{prefix}_{dict_key}"
d[dict_key] = value
return dict
@classmethod
def get_field(cls, obj, t: Type = None):
"""(参考)フィールドの取得"""
d = {}
for key, value in obj.__dict__.items():
if not key.startswith("__") and not callable(getattr(obj, key)):
if t is None:
d[key] = value
else:
if isinstance(value, t):
d[key] = value
# usage
# data = ReflectionUtil.get_variable_data(obj)