【Python】クラスの変数を取得する

python

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)

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