ホームページ  >  記事  >  バックエンド開発  >  Python で特定のクラスのサブクラスを見つけるにはどうすればよいですか?

Python で特定のクラスのサブクラスを見つけるにはどうすればよいですか?

DDD
DDDオリジナル
2024-11-16 01:39:03889ブラウズ

How can I find the subclasses of a given class in Python?

Python でのクラスのサブクラスの検索

Python では、__subclasses__( ) メソッド。このメソッドは、「オブジェクト」クラスから継承され、Python 3 で一般的に使用される新しいスタイルのクラスで使用できます。

サブクラスの名前を取得するには:

class Foo(object): pass
class Bar(Foo): pass
class Baz(Foo): pass
class Bing(Bar): pass

[cls.__name__ for cls in Foo.__subclasses__()]
# ['Bar', 'Baz']

あるいは、サブクラス自体を取得するには:

Foo.__subclasses__()
# [<class '__main__.Bar'>, <class '__main__.Baz'>]

基本クラスの関連付けを確認するには:

for cls in Foo.__subclasses__():
    print(cls.__base__)
# <class '__main__.Foo'>
# <class '__main__.Foo'>

再帰的サブクラス取得:

Ifサブサブクラス (孫など) をキャプチャする必要がある場合は、再帰的アプローチが必要です:

def all_subclasses(cls):
    return set(cls.__subclasses__()).union(
        [s for c in cls.__subclasses__() for s in all_subclasses(c)])

all_subclasses(Foo)
# {<class '__main__.Bar'>, <class '__main__.Baz'>, <class '__main__.Bing'>}

注: サブクラスのクラス定義が実行されていない場合 (例: そのモジュールがインポートされていない)、それは __subclasses__() によって検出できません。

クラス名からのサブクラスの取得:

代わりにクラス名を文字列として使用します。その場合は、次の手順に従います:

  1. クラス名を使用してクラス オブジェクトを検索します:

    • 同じモジュール内の場合:

      cls = globals()[name]
    • いずれかのモジュールの場合:

      import importlib
      modname, _, clsname = name.rpartition('.')
      mod = importlib.import_module(modname)
      cls = getattr(mod, clsname)
  2. __subclasses__() を使用して、次のモジュールのサブクラスを取得します。取得したクラス オブジェクト。

以上がPython で特定のクラスのサブクラスを見つけるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。