[解決済み】名前が与えられたクラスのすべてのサブクラスを見つけるには?
質問
私はPythonでベースクラスから継承されたすべてのクラスを取得するための作業アプローチが必要です。
どのように解決するのですか?
新スタイルのクラス(すなわち
object
これは Python 3 のデフォルトです)。
__subclasses__
メソッドがあり、サブクラスを返します。
class Foo(object): pass
class Bar(Foo): pass
class Baz(Foo): pass
class Bing(Bar): pass
以下は、サブクラスの名前です。
print([cls.__name__ for cls in Foo.__subclasses__()])
# ['Bar', 'Baz']
以下はサブクラスそのものです。
print(Foo.__subclasses__())
# [<class '__main__.Bar'>, <class '__main__.Baz'>]
サブクラスが実際にリストアップされていることを確認する
Foo
をベースとしています。
for cls in Foo.__subclasses__():
print(cls.__base__)
# <class '__main__.Foo'>
# <class '__main__.Foo'>
サブクラスが必要な場合は、recurseする必要があることに注意してください。
def all_subclasses(cls):
return set(cls.__subclasses__()).union(
[s for c in cls.__subclasses__() for s in all_subclasses(c)])
print(all_subclasses(Foo))
# {<class '__main__.Bar'>, <class '__main__.Baz'>, <class '__main__.Bing'>}
サブクラスのクラス定義がまだ実行されていない場合 (たとえば、サブクラスのモジュールがまだインポートされていない場合) は、そのサブクラスはまだ存在しないことに注意してください。
__subclasses__
はそれを見つけることができません。
名前がついている」ということですが、これはどういう意味ですか?Pythonのクラスはファーストクラスのオブジェクトなので、クラスの名前を文字列で代用したりする必要はありません。クラスを直接使用することができますし、おそらくそうすべきです。
クラスの名前を表す文字列があり、そのクラスのサブクラスを見つけたい場合は、2つのステップを踏みます:クラス名からクラスを見つけ、次に
__subclasses__
と同じです。
名前からどのようにクラスを見つけるかは、どこでクラスを見つけようと思っているかによります。もし、クラスを見つけようとしているコードと同じモジュールで見つけようと思っているのなら
cls = globals()[name]
を使えばいいし、万が一、ローカルで見つかることを期待しているのであれば
cls = locals()[name]
クラスがどのモジュールにも含まれる場合、名前の文字列は完全修飾名を含む必要があります - 以下のようなものです。
'pkg.module.Foo'
ではなく、単に
'Foo'
. 使用方法
importlib
を使用してクラスのモジュールをロードし、対応する属性を取得します。
import importlib
modname, _, clsname = name.rpartition('.')
mod = importlib.import_module(modname)
cls = getattr(mod, clsname)
どのようにクラスを見つけるか。
cls.__subclasses__()
は、そのサブクラスのリストを返します。
関連
-
python string splicing.join()とsplitting.split()の説明
-
[解決済み] [Solved] sklearn error ValueError: 入力に NaN、infinity または dtype('float64') に対して大きすぎる値が含まれている。
-
[解決済み] バイトを文字列に変換する
-
[解決済み] pipでPythonの全パッケージをアップグレードする方法
-
[解決済み] モジュールの関数名(文字列)を使って、モジュールの関数を呼び出す。
-
[解決済み] AndroidでPythonを実行する方法はありますか?
-
[解決済み] インスタンスのクラス名を取得する?
-
[解決済み] 同じディレクトリやサブディレクトリ内のクラスをインポートする方法は?
-
[解決済み】forループを使った辞書の反復処理
-
[解決済み】2つの辞書を1つの式でマージする(辞書の和をとる)には?)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Pythonコンテナのための組み込み汎用関数操作
-
pythonサイクルタスクスケジューリングツール スケジュール詳解
-
Python 可視化 big_screen ライブラリ サンプル 詳細
-
Python入門 openを使ったファイルの読み書きの方法
-
Pythonの@decoratorsについてまとめてみました。
-
[解決済み】ImportError: sklearn.cross_validation という名前のモジュールがない。
-
[解決済み] TypeError: 'DataFrame' オブジェクトは呼び出し可能ではない
-
[解決済み】Python - "ValueError: not enough values to unpack (expected 2, got 1)" の修正方法 [閉店].
-
[解決済み】Flaskのテンプレートが見つからない【重複あり
-
[解決済み] Pythonで現在のモジュール内のすべてのクラスのリストを取得するにはどうすればよいですか?